catch区内的异常

时间:2009-05-23 08:38:49

标签: c#

  

可能重复:
  In C# will the Finally block be executed in a try, catch, finally if an unhandled exception is thrown ?

最终会在这种情况下执行(在C#中)?

try
{
    // Do something.
}
catch
{
    // Rethrow the exception.
    throw;
}
finally
{
    // Will this part be executed?
}

3 个答案:

答案 0 :(得分:11)

是的,最后总是被执行。

演示行为的简单示例:

private void Button_Click(object sender, EventArgs e)
{
    try
    {
        ThrowingMethod();
    }
    catch
    { 
    }
}

private void ThrowingMethod()
{
    try
    {
        throw new InvalidOperationException("some exception");
    }
    catch
    {
        throw;
    }
    finally
    {
        MessageBox.Show("finally");
    }
}

答案 1 :(得分:3)

(编辑:收录评论的澄清 - 谢谢你们)
最后总是执行。我所知道的唯一例外是;

  • 您拔下电源插头
  • 如果作为“后台”运行的线程由于其所属的主程序结束而终止,则该线程中的finally块将不会被执行。见Joseph Albahari
  • 其他异步异常,例如stackoverflows和out-of-memory。见this question

大多数没有执行Finally的场景与catastrohic失败有关,除了后台线程1之外,所以值得特别注意那个。

答案 2 :(得分:1)

是。

你可以很容易地测试出来。

但是你提出这个问题是一个很好的理由,可以将它写成嵌套在try / finally中的try / catch块。眼睛容易多了。