2010-11-26 92 views
22

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

Application.ThreadException 

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

AppDomain.CurrentDomain.UnhandledException 

但是,這似乎關閉應用程序在觸發後,因爲前者沒有。

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

+6

是,請確保您的線程不會拋出未處理的異常。正如Eric Lippert所說:「最安全的做法是假定每個未處理的異常都是致命的異常或未處理的頭向異常,在這兩種情況下,正確的做法是立即停止執行。」 http://blogs.msdn.com/b/ericlippert/archive/2010/11/23/asynchrony-in-c-5-part-eight-more-exceptions.aspx – Ani 2010-11-26 11:46:11

+4

你忘了這篇文章的最好的部分:「正如Ripley所說,當出現問題時,您應該從軌道起飛並將整個場地進行核輻射;這是確保「 – 2010-11-26 12:03:20

回答

21

@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 
    } 

這一大堆更容易找到線程的方法,它不是通過邏輯移動到一個單獨的方法處理異常正確,只是保持try/catch塊中的線程方法。

1

是的,你必須手動捕捉線程異常。

然而,這段代碼:

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 
} 
相關問題