在catch块中发生异常

3

请查看此重复问题(或其中链接的其他重复问题):https://dev59.com/eEfRa4cB1Zd3GeqP9X3Z - Dirk Vollmar
3个回答

11

是的,finally块总是会被执行。

一个演示其行为的简单例子:

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");
    }
}

3

最终块始终会被执行。我所知道的唯一例外情况是:

  • 您拔掉电源插头
  • 如果作为“后台”运行的线程因其所属的主程序即将结束而被终止,则该线程中的finally块将不会被执行。请参见Joseph Albahari
  • 其他异步异常,如堆栈溢出和内存不足。请参见此问题

大多数Finally未被执行的情况与灾难性故障有关,除了后台线程之外,因此特别值得注意。


请参考以下相关答案:https://dev59.com/eEfRa4cB1Zd3GeqP9X3Z - Dirk Vollmar
唯一的两个例外是...。还有其他的,例如Environment.FailFast。 - Joe
谢谢Divo和Joe - 我在那里学到了新东西。 - flytzen

1

是的。

你可以轻松地测试这个。

但是,你提出这个问题的事实本身就是在为将其编写为try/catch块内嵌于try/finally中进行辩护。这样更易于阅读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接