假设您有以下代码:
而不是:
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
所以我的简单问题是:如果出现异常,即使之前有一些行抛出也会达到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
一切顺利!
的Inno
答案 0 :(得分:25)
所以我的简单问题是:如果出现异常,即使之前有一些行抛出也会达到finally块?
是。 Finally
block 总是 1)已执行并且精确存在以进行清理。在您的代码中,删除Catch
块,它什么都不做。更糟糕的是,它实际上会破坏堆栈跟踪,因为你不会重新抛出原始异常,而是抛出一个新异常。
如果您确实需要Catch
块然后重新抛出异常,请使用以下命令:
Catch e As XyzException
' … do some stuff. '
Throw
End Try
1):警告:有一些例外,例如StackOverflowException
(如何拟合......),需要特别注意,并且可能不会触发Finally
块。正确处理它们通常很困难。
答案 1 :(得分:5)
不,不保证能够运行。有一些例外 - 例如StockOverflowException和OutOfMemoryException - 其中不保证执行finally块。
答案 2 :(得分:1)
在几乎所有情况下,finally都将在Try / Catch块中执行(值得注意的例外,包括发生StackOverflowException或OutOfMemoryException时)。我很好奇,为什么你没有为自己尝试这个。学习事物的一个有价值的方法就是实际上为自己试一试 - 毕竟,你最终可能会接受一个错误或误导的答案,并且从那时起你就会在这种虚假的情况下进行劳动。
答案 3 :(得分:1)
注意:System.Environment.FastFail方法是立即杀死当前进程/线程,没有最后执行部分。
答案 4 :(得分:0)
是的,最终在任何情况下执行。 (只有少数例外 - Response.Redirect和一些多线程的情况)