【问题标题】:LegacyUnhandledExceptionPolicy doesn't allow to catch (and swallow) ThreadAbortException?LegacyUnhandledExceptionPolicy 不允许捕获(并吞下)ThreadAbortException?
【发布时间】:2012-10-19 21:48:29
【问题描述】:

我正在使用 .NET 1.1 兼容模式来处理未处理的异常。问题是当 LegacyUnhandledExceptionPolicy 设置为“1”(这是我想要的)时,我无法捕获和吞下 ThreadAbortException。

示例代码:

App.config:

<configuration>
   <runtime>
      <legacyUnhandledExceptionPolicy enabled="1"/>
   </runtime>
</configuration>

代码:

   class Program {

      static void Main(string[] args) {
         AppDomain.CurrentDomain.UnhandledException += _onBackgroundThreadCrash;
         var t = new Thread(_worker) { IsBackground = true };
         t.Start();
         Thread.Sleep(1000);
         t.Abort();
         Console.ReadLine();
      }

      private static void _worker() {
         try {
            while (true);
         } catch (ThreadAbortException) { 
            // expected thread exit, don't rethrow
         }
      }

      private static void _onBackgroundThreadCrash(object sender, UnhandledExceptionEventArgs e) {
         Console.WriteLine(e.ExceptionObject as Exception);
      }

   }

当遗留异常处理为“0”(关闭)时,上述代码如预期般安静地吞下 ThreadAbortException。

但是,当遗留异常处理为“1”时,上面的代码将 ThreadAbortException 打印到控制台,这不是我所期望的。

有什么想法吗?

谢谢。

【问题讨论】:

    标签: .net multithreading threadabortexception


    【解决方案1】:

    您无法捕获 ThreadAbortException,它总是在捕获后重新引发。您的问题有两种基本解决方案。

    第一个是你重置了中止请求:

    catch (ThreadAbortException) {
        // expected thread abort request, reset it and exit thread
        Thread.ResetAbort();
    }
    

    第二个是解决启用遗留异常处理时发生的另一件事。现在也针对非致命异常引发 AppDomain.UnhandledException 事件。像这样编写您的异常处理程序:

    private static void _onBackgroundThreadCrash(object sender, UnhandledExceptionEventArgs e) {
        if (e.IsTerminating) {
            Console.WriteLine(e.ExceptionObject as Exception);
        }
    }
    

    我不得不推荐第一个解决方案,你真的不希望终止线程的未处理异常根本不留下任何痕迹。

    【讨论】:

    • 谢谢,这一切都说得通。我仍然想知道为什么当 LegacyUnhandledExceptionPolicy=0 有 ThreadAbortException 时我的处理程序没有被调用?
    • 这只是 .NET 2.0 中异常处理策略更改的一部分,AppDomain.UnhandledException 仅针对终止应用程序的异常引发。
    猜你喜欢
    • 2021-07-07
    • 2013-02-18
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2011-08-08
    相关资源
    最近更新 更多