假设您有以下代码:
而不是这样做:
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
我想要做:
Try
'
' Initialize some objects
'
'
' do something that fails
'
Catch e As Exception
Throw e
Finally
'
'Clean up initialized objects
'
End Try
所以我的简单问题是:如果出现异常,即使之前有 throw 一些行,是否也会到达 finally block ?
[编辑]
感谢您的快速答复。
我认为在第一行会有 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
祝一切顺利!
英诺
最佳答案
So my simple question is: In case of an exception is the finally block reached even if there is a throw some lines before?
是的。
Finally
block总是1) 被执行并且精确地存在以进行清理。在您的代码中,删除 Catch
block ,它什么都不做。更糟糕的是,它实际上破坏了堆栈跟踪,因为您没有重新抛出原始异常,而是抛出了一个新异常。如果您真的需要
Catch
然后重新抛出异常的 block ,使用以下内容:Catch e As XyzException
' … do some stuff. '
Throw
End Try
1): 警告购买者:有一些异常(exception),例如
StackOverflowException
(多么合适……)需要特别注意并且可能不会触发Finally
堵塞。正确处理它们通常非常困难。
关于.net - 异常处理 : Is finally executed after throw?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1577049/