异常处理:抛出后最终执行?

Inn*_*nno 18 .net vb.net exception-handling

假设您有以下代码:

而不是做:

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
Run Code Online (Sandbox Code Playgroud)

我想要做:

Try
    '
    ' Initialize some objects
    '

    '
    ' do something that fails
    '
Catch e As Exception
    Throw e
Finally
    '
    'Clean up initialized objects
    '
End Try
Run Code Online (Sandbox Code Playgroud)

所以我的简单问题是:如果出现异常,即使之前有一些行,也会达到finally块?

[编辑] 感谢您的快速解答.

在第一行中我会想到NullReference-,COM-和FileNotFound-Exceptions.

好的,我会去找这个代码:

Try
    '
    ' Initialize some objects
    '

    '
    ' do something that fails
    '
Catch e As Exception      ' or just "Catch"??        
    Throw
Finally
    '
    'Clean up initialized objects
    '
End Try
Run Code Online (Sandbox Code Playgroud)

祝一切顺利!

英诺

Kon*_*lph 25

所以我的简单问题是:如果出现异常,即使之前有一些行,也会达到finally块?

是.该Finally始终1)执行并且精确存在以进行清理.在您的代码中,删除Catch块,它什么都不做.更糟糕的是,它实际上会破坏堆栈跟踪,因为您不会重新抛出原始异常,而是抛出一个新异常.

如果您确实需要一个Catch块然后重新抛出异常,请使用以下命令:

Catch e As XyzException
    ' … do some stuff. '
    Throw
End Try
Run Code Online (Sandbox Code Playgroud)

1):注意事项:有一些例外,例如StackOverflowException(如何拟合......)需要特别注意并且可能不会触发Finally阻止.正确处理它们通常很困难.


Max*_*erl 5

不,它不能保证运行.有一些例外 - 例如StockOverflowException和OutOfMemoryException - 其中不保证finally块的执行.