【问题标题】:Nested try-finally in C#在 C# 中嵌套 try-finally
【发布时间】:2012-06-17 20:52:02
【问题描述】:

为什么不是“Console.WriteLine("asdf");”行执行?其他都是。是不是也不能跳出finally作用域?

static bool Func()
{
    try
    {
        try
        {
        }
        finally
        {
            try
            {
                throw new ApplicationException();
            }
            finally
            {
                Console.WriteLine("asd");
            }

            Console.WriteLine("asdf");
        }
    }
    finally
    {
        Console.WriteLine("asd");
    }
}

【问题讨论】:

标签: c# try-catch


【解决方案1】:

Finally 块只保证(至少大部分保证,请参阅下面的 MSDN 节选),如果 try 块抛出异常,它们将被输入。如果您在 finally 块抛出异常,该异常将导致控件离开 finally 块,并且该 finally 块中的其余代码将不会执行。

在您的情况下,未执行的行发生在同一个 finally 块中的异常之后,因此它被跳过。

来自MSDN - try-finally

finally 块可用于清理任何资源 分配在 try 块中,用于运行任何必须执行的代码 即使 try 块中发生异常。通常情况下, finally 块的语句在控制离开 try 时执行 声明,是否发生控制权转移是由于 正常执行,执行 breakcontinuegotoreturn 语句,或从 try 语句中传播异常。

在处理的异常中,保证关联的 finally 块 要运行。但是,如果异常未处理,则执行 finally 块取决于异常展开操作的方式 触发。反过来,这取决于您的计算机的设置方式。 有关详细信息,请参阅 CLR 中的未处理异常处理。

注意:Unhandled Exception Processing in the CLR 引用了 MSDN 杂志 2008 年 9 月号中的一篇文章。所有 2008 年及更早的 MSDN 杂志都只能以 .chm 文件的形式提供,并且需要在查看之前下载。

【讨论】:

  • "Finally blocks only guarantee *snip* that they will be entered if the try block throws an exception" 你的意思是 finally 块只有在 try 块退出后才进入? (catch 块在异常时执行)
  • 确实如此。我试图指出它们如何处理异常,以及它们不保证它们会全部运行,但它们至少会被输入。
  • 见文章MSDN Magazine 2008 September: Unhandled Exception Processing in the CLR。 (打开chm需要解锁:文件属性->常规->解锁)
【解决方案2】:

我认为可以回答这个问题的最佳方法是使用代码,因此使用下图

【讨论】:

  • + 1 表示很棒的图片...说出一千个单词。
  • 我认为它被最外面的try块捕获了,最后什么都没有捕获。
【解决方案3】:

因为在 finally 块中引发了异常,所以它会导致控制权落到最终的 finally 块中。所以“asdf”WriteLine 永远不会执行。

【讨论】:

    【解决方案4】:

    finally(或 catch)块中抛出的异常会取消该 finally(或 catch)块的其余部分。

    【讨论】:

      【解决方案5】:

      错误发生在第三个 try 块内,导致其对应的 finally 被执行。但是,这会导致它从当前的 finally 中出错并被原始的 try-finally 块捕获。

      【讨论】:

        【解决方案6】:

        因为你已经抛出了 try 块,它会用 Console.WriteLine("asd"); 执行 finally 块并退出到外部 try catch

        【讨论】:

          【解决方案7】:

          当我对跨不同主机平台部署的代码使用 try-finally 块时,我发现: 当 try 块上没有抛出异常时。

          一些 Windows 平台总是执行 finally 块并且 一些平台从未执行 finally 块。

          我的 finally 块包含关闭错误日志的指令,并且未能执行 finally 块总是在退出时引发另一个异常,只留下密码信息可用于找出导致错误的原因。 对于我的应用程序,try finally 块比它们的价值更麻烦。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-09-01
            • 1970-01-01
            • 2018-11-07
            • 2013-05-26
            • 1970-01-01
            • 2020-08-24
            • 2013-03-06
            相关资源
            最近更新 更多