试着抓住最后的问题

时间:2010-07-21 22:10:57

标签: c# exception-handling

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

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

5 个答案:

答案 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上已经有很多线程可以处理这个问题了。