开发者

Exception handling: Is finally executed after throw?

开发者 https://www.devze.com 2022-12-08 11:14 出处:网络
Assume you have the following code: Instead of doing: Try \' \' Initialize some objects \' \' \' do something that fails

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 init开发者_JAVA技巧ialized 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


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.


No, it is NOT guaranteed to run. There are certain exceptions - for example StockOverflowException and OutOfMemoryException - where the execution of a finally block is not guaranteed.


In almost all cases, a Finally will execute in a Try/Catch block (notable exceptions including when a StackOverflowException or OutOfMemoryException occur). I am curious though, why you didn't try this out for yourself. A valuable way to learn things is to actually try them out for yourselves - after all, you could end up accepting an answer that is wrong or misleading, and you will labour under this falsehood from that point on.


NOTE: System.Environment.FastFail method was kill current process/thread immediatly, without execute finally sections.


Yes it does, finally is executed in any case. (there are only few exceptions - Response.Redirect and some cases with multithreading)

0

精彩评论

暂无评论...
验证码 换一张
取 消