试着抓住最后的问题

Sco*_*t W 17 c# exception-handling

在Try Catch Finally块中,finally块总是执行,无论是什么,或者只有catch块没有返回错误?

我的印象是,如果catch块没有错误,则finally块只会执行.如果由于错误而执行了catch块,那么它是否应该一起停止执行并返回错误消息(如果有的话)?

Mar*_*ers 31

无论是否存在异常,finally块(几乎)总是执行.

我说几乎是因为有一些案例最终无法保证被调用:

此外,即使最后一个块被输入,如果ThreadAbortException在线程进入finally块时发生,则不会运行finally块中的代码.

可能还有其他一些案例......

  • 像StackOverflow和OutOfMemory这样的无法捕获的异常也可能导致它被跳过. (3认同)

Mic*_*urn 12

finally块不仅会在catch块之后执行,而且甚至不需要捕获任何异常以便finally执行.以下是完全合法的代码:

try 
{
//do stuff
}
finally 
{
   //clean up
}
Run Code Online (Sandbox Code Playgroud)

我实际上在catch块包含的一些代码中取出了catch块:

catch(Exception ex)
{
   throw ex;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,所需要的只是清理,所以我只用try {}和最后{}阻止它,让异常冒出来,它们的堆栈跟踪完好无损.

  • @ScottW:将代码紧跟在您希望在try块中抛出的代码之后. (2认同)
  • 在参考文件中保持堆栈跟踪在冒泡的异常中保持不变,您只需使用<code> throw; </ code> sans <code> ex </ code> (2认同)

Man*_*anu 5

几乎在每种情况下都会执行finally块.这就是为什么它被称为'终于'.

有关示例,请参阅c-sharpcorner.com上的这篇文章.

更新:这是真的,如果你插上电缆,熔化处理器或研磨主板,即使是最终的'最终'也不会被执行.

但是在几乎每个"正常"场景中,即你的代码是否抛出异常,finally块将被执行.据我所知,这条规则唯一的"真正的"例外是stackoverflow异常,它会终止程序,而不会最终进入.

更新2:此问题专门针对C#提出.这个答案不包括Java,Python,Matlab或Scheme.

  • <pedant>拔出电源线,看它是否执行</ pedant> :) (6认同)