在Try Catch Finally块中,finally块总是执行,无论是什么,或者只有catch块没有返回错误?
我的印象是,如果catch块没有错误,则只执行finally块。如果由于错误而执行了catch块,那么它是否应该一起停止执行并返回错误消息?
答案 0 :(得分:31)
无论是否存在异常,finally块(几乎)总是执行。
我说几乎是因为有一些案例最终无法保证被调用:
此外,即使在线程进入finally块时发生ThreadAbortException
的情况下输入finally块,也不会运行finally块中的代码。
也可能还有其他一些案例......
答案 1 :(得分:12)
不仅会在catch块之后执行finally块,尝试甚至不需要捕获任何异常以便finally执行。以下是完全合法的代码:
try
{
//do stuff
}
finally
{
//clean up
}
我实际上在catch块包含的一些代码中取出了catch块:
catch(Exception ex)
{
throw ex;
}
在这种情况下,所需要的只是清理,所以我只用try {}和最后{}阻止它,让异常冒出来,堆栈跟踪完好无损。
答案 2 :(得分:5)
finally块在几乎中执行。这就是为什么它被称为“终于”。
有关示例,请参阅c-sharpcorner.com上的this article。
更新:如果您插上电缆,熔化处理器或研磨主板,即使是最终的“最终”也不会被执行。
但是在几乎每个“正常”场景中,即你的代码是否抛出异常,finally块将被执行。据我所知,此规则唯一的“真正”例外是 stackoverflow 异常,它将终止程序,而不会最终进入。
更新2:此问题专门针对C#提出。这个答案不包括Java,Python,Matlab或Scheme。
答案 3 :(得分:1)
finally块将执行,但你需要注意finally块中的异常。
try {
// some disposable method "o"
} finally {
o.Dispose(); // if o is null, exception is thrown
// anything after this exception will fail to execute
}
答案 4 :(得分:0)
finally块中的代码总是被执行,如果有异常则无法执行。顺便说一句,我认为SO上已经有很多线程可以处理这个问题了。