Exception handling: Is finally executed after throw?
.net, exception, vb.net
Solution
So my simple question is: In case of an exception is the finally block reached even if there is a throw some lines before?
Yes. The `Finally` block is always1) executed and exists precisely for clean-up. In your code, remove the `Catch` block, it does nothing. Worse, it actually destroys the stack trace because you don’t re-throw the original exception, you throw a new one.
If you really need a `Catch` block that then re-throws the exception, use the following:
Catch e As XyzException
' … do some stuff. '
Throw
End Try
1): Caveat emptor: there are some exceptions such as `StackOverflowException` (how fitting …) which require special attention and may not trigger the `Finally` block. Handling them correctly is usually quite difficult.
Problem
Assume you have the following code: Instead of doing: ``` Try ' ' Initialize some objects ' ' ' do something that fails ' ' ' Clean up-code that gets not reached because exception ' Catch e As Exception ' 'Clean up initialized objects ' Throw e End Try ``` I would like to do: ``` Try ' ' Initialize some objects ' ' ' do something that fails ' Catch e As Exception Throw e Finally ' 'Clean up initialized objects ' End Try ``` So my simple question is: In case of an exception is the finally block reached even if there is a throw some lines before? [EDIT] Thanks for your fast answers. In first line there will be NullReference-, COM- and FileNotFound-Exceptions I think. Ok, I will go for this code: ``` Try ' ' Initialize some objects ' ' ' do something that fails ' Catch e As Exception ' or just "Catch"?? Throw Finally ' 'Clean up initialized objects ' End Try ``` All the best! Inno