在单独的线程上捕获未处理的异常

Dar*_*ung 24 c# exception-handling

我正在使用以下事件来捕获主UI线程中的未处理异常.

Application.ThreadException 
Run Code Online (Sandbox Code Playgroud)

不幸的是,它没有在单独的线程中捕获那些未处理的错误.我知道

AppDomain.CurrentDomain.UnhandledException
Run Code Online (Sandbox Code Playgroud)

但是,这似乎在触发时关闭应用程序,而前者则没有.

有没有办法在单独的线程上处理未处理的异常,而不关闭应用程序?

jga*_*fin 24

@Ani已经回答了你的问题.虽然我不同意线程中未处理的异常应该终止应用程序.使用线程通常意味着您拥有某种服务器应用程序.把它搞砸可能会导致很多愤怒的用户.

我写过一篇关于正确异常处理的小文章:http://blog.gauffin.org/2010/11/do-not-catch-that-exception/

您应该始终捕获线程的异常.我通常使用以下模式:

  void ThreadMethod(object state)
  {
      try
      {
          ActualWorkerMethod();
      }
      catch (Exception err)
      {
          _logger.Error("Unhandled exception in thread.", err);
      }
  }

  void ActualWorkerMethod()
  {
      // do something clever
  }
Run Code Online (Sandbox Code Playgroud)

通过将逻辑移动到单独的方法并将try/catch块保留在线程方法中,找到不能正确处理异常的线程方法要容易得多.

  • 如果另一个线程上未处理的异常是由您正在使用的 3rd 方组件的私有异步方法引发的,您如何解决这个问题? (2认同)