簡體   English   中英

在單獨的線程上捕獲未處理的異常

[英]Catching unhandled exception on separate threads

我正在使用以下事件來捕獲主 UI 線程中未處理的異常。

Application.ThreadException 

不幸的是,它不會在單獨的線程中捕獲那些未處理的錯誤。 我知道

AppDomain.CurrentDomain.UnhandledException

但是,這似乎會在觸發時關閉應用程序,而前者則不會。

有沒有辦法在不關閉應用程序的情況下處理單獨線程上未處理的異常?

@Ani 已經回答了您的問題。 雖然我不同意線程中未處理的異常應該終止應用程序。 使用線程通常意味着您擁有某種服務器應用程序。 將其關閉可能會導致很多憤怒的用戶。

我寫了一小部分關於正確的異常處理: https : //coderr.io/exception-handling

您應該始終捕獲線程的異常。 我通常使用以下模式:

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

  void ActualWorkerMethod()
  {
      // do something clever
  }

通過將邏輯移動到一個單獨的方法中並且只將 try/catch 塊保留在線程方法中,找到不能正確處理異常的線程方法要容易得多。

當然,您應該始終處理所有異常。 但是,如果您目前無法這樣做,則可以嘗試以下操作:

應用程序將在UnhandledException事件處理程序之后崩潰/關閉。 您可以在事件處理程序中添加延遲來防止這種情況。 其他線程無一例外(例如主線程)可以繼續。 所以應用程序不會關閉並且可以繼續。 但是,有異常的線程將保持睡眠狀態。 因此,您可能會遇到“內存/線程泄漏”。

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        // Log the exception, display it, etc
        Debug.WriteLine((e.ExceptionObject as Exception).Message);
        Thread.Sleep(100000000);
    }

目前沒有更好的解決方案。 您可能會發現更改配置文件,但我認為這同樣骯臟: https : //stackoverflow.com/a/15348736

是的,您必須手動捕獲線程上的異常。

但是,這段代碼:

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

void ActualWorkerMethod()
{
    // do something clever
}

可以使用PostSharp簡化為:

[LogExceptions]
void ActualWorkerMethod()
{
    // do something clever
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM