Question:
1. Why the next one line is allowed to be executed upon error-raise? Shouldn't it return to caller and exit?
2. Error 21, still executed in CATCH if raised in TRY. Is this how it should handle the fatal error?
3. The TRY..CATCH seems mediocre method to trap and report error. Saying this because, if error raised with 0-10 in TRY-block (unexpected, an execution error), totally out of developer's control to handle the error. Is there any better concept?

1. All lines are execute. Not just 1 line below the. If you want to exit, use severity more than 10 (> 10).
2. No comment
3. I am not use TRY CATCH. I usually use RAISERROR alone with severity 16. So the error will be send to my application immediately.

1. No all lines are executed. If it does, i would have made my conclusion that execution does not terminate. But surprisingly it does after the last 1 line.
2. This shows, try...catch in MSSQL is not the solution for the @@ERROR problem we faced.

Actually, the code seems to be behaving properly. Where is the error thrown? I don't see any code that would cause an error. The reason the first line in the TRY block prints and not the remaining lines is that, since no error occurred, all of the error functions return NULL. Thus, nothing prints.

As one of the other posters mentioned, RAISERROR doesn't terminate a batch. You would need to follow it with RETURN.

As a test, surround all of the error functions with IsNull() or Coalesce().