【问题标题】:Are there any circumstances under which the finally block does not get executed? [duplicate]有没有什么情况下finally块没有被执行? [复制]
【发布时间】:2013-03-14 18:28:40
【问题描述】:

请注意这段代码:

 class CTestFinally
  {
      public static void Run()
      {
          try
          {
              TryAndTry();
          }
          catch (Exception exError)
          {
              Console.WriteLine(exError.Message);
          }
          finally
          {
              Console.WriteLine("Finally...!");
          }
          Console.ReadKey();
      }

      static void TryAndTry()
      {
          try
          {
              TryAndTry();
          }
          catch (Exception exError)
          {
              Console.WriteLine(exError.Message);
          }
          finally
          {
              Console.WriteLine("Try: Finally...!");
          }
          }
}
      }

最后没有执行,因为我们得到堆栈溢出错误。

是否有任何情况下finally块不被执行,除了 上面的问题?

【问题讨论】:

  • 你的电脑炸了。世界末日。电脑休眠等...
  • 是的,“最后没有执行,因为我们得到堆栈溢出错误。”是 finally 块不会被执行的许多情况之一。查看右侧处理相同问题的一些链接。

标签: c#


【解决方案1】:

StackOverflowException 是 CLR 主机通常会特别处理的少数几种异常之一。例如,ASP.NET 将终止工作进程。这非常很难调试,因为你的应用程序就这样消失了。我确信 SQL Server 有类似的策略(比如卸载 appdomain)。

原因是这是一个不稳定的条件,不允许可靠的错误恢复(毕竟您的堆栈不可用!例如,您可以不调用您的记录器或发送电子邮件。堆栈上没有空间.).

这种类型的另一种是 OutOfMemoryException(您甚至不能分配异常 - 这就是 CLR 预分配一个 OOM 实例的原因...)。我认为 ASP.NET 可以容忍这种情况,而 SQL Server 会杀死您的 appdomain。

对于正常的异常,这可以正常工作。

【讨论】:

  • 而且在过去的几年里,搜索有关 StackOverflow 异常的信息也变得非常困难.. :)
【解决方案2】:

这永远不会执行finally:

using System;

namespace Demo
{
    public static class Program
    {
        [STAThread]
        public static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("In try");
                Environment.FailFast("Aaaaaargh");
            }

            finally
            {
                Console.WriteLine("In finally");
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 2017-06-27
    • 2012-09-07
    • 2021-10-22
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多