试着抓住最后的问题
在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可以解决这个问题。