【问题标题】:Why is outer "finally" not being executed when inner "catch" throws?当内部“catch”抛出时,为什么外部“finally”没有被执行?
【发布时间】:2012-04-07 15:05:27
【问题描述】:

我编写了一个简单的程序来测试“finally”块无论如何都会执行的理论。 但是,我从下面的 pgm 看到的是,控制似乎永远不会进入外部 finaly 块。

我尝试在 Visual Studio 中执行 F5 和 Ctrl-F5,结果相同。

有人可以解释为什么我会看到这种行为吗?

控制台窗口的输出是:

内扣

内终于

外圈

未处理的异常:

..然后应用程序崩溃

public class Program
{
    static void Main()
    {
        try
        {
            try
            {
                string s = null;
                s.ToString();
            }
            catch
            {
                Console.WriteLine("inner catch");
                throw;
            }
            finally
            {
                Console.WriteLine("inner finally");
            }

            return;
        }
        catch
        {
            Console.WriteLine("outer catch");
            throw;
        }
        finally
        {
            Console.WriteLine("outer finally");
        }
    }
}

【问题讨论】:

    标签: c# exception exception-handling try-catch


    【解决方案1】:

    “外部 finally”在异常处理之后运行。

    这是在调试器之外运行此代码的输出:

    内扣 内心终于 外接 未处理的异常:System.NullReferenceException:对象引用未设置为 一个对象的实例。 在 c:\Users\DaveShaw\Documents\Visual Studio 11\Pro 中的 SOConsole.Program.Main() jects\SO\SOConsole\Program.cs:第 35 行 终于外了 按任意键继续 。 . .

    发生异常时显示以下内容:

    点击“取消”后,应用程序恢复并显示“outer finally”。

    如果由于某种原因您在应用程序有机会进入“外部最终”之前关闭了您的应用程序,那么您将永远不会看到您的消息。如果应用程序的进程被“终止”,那么 finally 将被跳过,以防它们包含阻止应用程序关闭的代码。否则可能无法终止该进程。

    【讨论】:

    • 哦,好的。单击取消确实使“外部最终:声明出现。很高兴知道这一点。谢谢
    【解决方案2】:

    应用程序可能在标准输出缓冲区被刷新之前终止。

    要么向外部finally(WriteLine)添加一个断点,要么从外部finally抛出一个不同异常来确认。 finally跳过:这样做将是一个严重的错误!

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2016-12-07
      • 2012-11-14
      • 1970-01-01
      • 2022-11-09
      • 2022-01-08
      相关资源
      最近更新 更多