.net 异常处理:在抛出后是否最终执行?
假设您有以下代码: 而不是做:.net 异常处理:在抛出后是否最终执行?,.net,vb.net,exception-handling,.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 '
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
所以我的简单问题是:在异常的情况下,即使之前抛出了几行代码,是否最终到达了块
[编辑]
谢谢你的快速回答
在第一行中,我认为会出现NullReference、COM和FileNotFound异常
好的,我将使用以下代码:
Try
'
' Initialize some objects
'
'
' do something that fails
'
Catch e As Exception ' or just "Catch"??
Throw
Finally
'
'Clean up initialized objects
'
End Try
祝你一切顺利
因诺
所以我的简单问题是:在异常的情况下,即使之前抛出了几行代码,是否最终到达了块
对。该程序始终执行,且存在的目的正是为了清理。在代码中,删除Catch
块,它什么也不做。更糟糕的是,它实际上会破坏堆栈跟踪,因为您不会重新抛出原始异常,而是抛出一个新异常
如果确实需要重新抛出异常的Catch
块,请使用以下命令:
Catch e As XyzException
' … do some stuff. '
Throw
End Try
1) :注意:有一些例外情况,如
StackOverflowException
(如何安装…),需要特别注意,并且可能不会触发最终
块。正确地处理它们通常非常困难。是的,在任何情况下都会执行。(只有少数例外-Response.Redirect和一些使用多线程的情况)不,它不能保证运行。存在某些异常,例如StockOverflowException和OutOfMemoryException,其中finally块的执行无法得到保证。在几乎所有情况下,finally都将在Try/Catch块中执行(显著的异常包括StackOverflowException或OutOfMemoryException发生时)。不过我很好奇,你为什么不亲自尝试一下呢。学习东西的一个有价值的方法是亲自尝试——毕竟,你最终可能会接受一个错误或误导性的答案,从那时起,你将在这个错误下工作。注意:System.Environment.FastFail方法是立即杀死当前进程/线程,不必执行finally部分。您不应该编写Throw e
,而应该编写Throw
。否则,您将重置异常堆栈跟踪,因此您将丢失有关初始引发异常的位置的信息Konrad-Finally并不总是执行。例如,当您有OutOfMemoryException时,它将不会被执行。@Pete:是的,但这些是特定的边缘情况(但我应该提到它们)。@Pete:您不是指StackOverflowException吗。在发生OutOfMemoryException时,在finally运行的地方进行测试非常容易。@Konrad:我不能说OOME是否会阻止finally块运行,但我以前从未听说过。然而,构建一个将运行的案例很容易,因此Pete的观点并不完全正确。另一方面,据我所知,SOE将关闭运行时,这将始终阻止finally blocks运行。@Luke:谢谢更新和链接。我不知道OOME会这么做。然而,这与“当你有一个OOME时它将不会被执行”是不同的,这正是我试图澄清的。我尝试了这一点,但我的调试器在抛出时停止了。我阅读了文档,没有找到任何关于我的问题的提示。我问这些问题是为了得到直接属于我的问题和间接属于我的问题的答案(比如“最终是在特殊情况下不执行的”)。