试着抓住最后的问题

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

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

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

try { //do stuff } finally { //clean up } 

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

 catch(Exception ex) { throw ex; } 

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

无论是否存在exception,finally块(几乎)总是执行。

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

  • 如果代码中存在无限循环或死锁,那么执行仍然在try或catch块中,那么finally块将永远不会执行。
  • 如果您的申请因终止程序而突然终止。
  • 停电。
  • 调用Environment.FailFast 。
  • 一些例外,例如:
    • StackOverflowException
    • OutOfMemoryExceptionexception
    • ExecutingEngineException (现已过时)
  • 终结器( 源 )中抛出的exception。

此外,即使在线程进入finally块时发生ThreadAbortException时输入finally块,也不会运行finally块中的代码。

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

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

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

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

但是在几乎每个“正常”场景中,即你的代码是否抛出exception,finally块将被执行。 据我所知,此规则唯一的“真正”例外是stackoverflowexception,它将终止程序,而不是最终进入。

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

finally块将执行,但您需要注意finally块中的exception。

 try { // some disposable method "o" } finally { o.Dispose(); // if o is null, exception is thrown // anything after this exception will fail to execute } 

finally块中的代码总是被执行,如果有exception则无法执行。 顺便说一句,我认为SO上已经有很multithreading可以解决这个问题。