2013-06-20 47 views
2

我正在使用普通的threads實現的項目。應用程序中的大多數預期異常都會被處理,但是,有些線程會引發意外的異常並導致應用程序崩潰(應用程序同時基於I/OClient-Server,因此實際上不可能處理所有異常)。在線程中拋出未處理的異常不會被捕獲

爲了解決這個問題,我試圖定義一個全局的UnhandledExceptionHandler,以便應用程序顯示一個友好的消息而不是崩潰。這是我試過的:

public partial class App : Application 
{ 
    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     AppDomain.CurrentDomain.UnhandledException += 
      new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

     // The rest of the startup logic goes here 
    } 

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     Utilities.DisplayUnhandledException((Exception)e.ExceptionObject); 
    } 
} 

雖然這不起作用。 CurrentDomain_UnhandledException永遠不會被調用。不幸的是,我無法改變應用程序的結構,這意味着我無法使用任務並行庫。我無法弄清楚爲什麼這不起作用。有沒有其他方法來處理線程中拋出的異常?任何幫助表示讚賞。

+0

嘗試'Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);'和'Application.ThreadException + = Application_ThreadException;' – Blorgbeard

+0

這裏有一些徹底的解釋:http://stackoverflow.com/questions/1472498/wpf-global-exception-handler –

回答

3

你的方法是正確的。但是,您將無法停止應用程序的終止。

當您在應用程序CurrentDomain_UnhandledException中創建的線程上拋出未處理的異常時,將會調用您允許您記錄或報告異常。但是,除非e.IsTerminatingfalse,否則您將無法停止應用程序的終止。您可以在Exceptions in Managed Threads中閱讀有關此行爲的更多信息。

如果您發現CurrentDomain_UnhandledException從未被調用,則應驗證調用Application_Startup來設置處理程序。

如果仍有問題,應驗證Utilities.DisplayUnhandledException不會引發異常。這也將導致您的應用程序立即終止。特別是,如果e.ExceptionObject不是Exception類型,則將其轉換爲Exception將引發異常。但是,在正常情況下,當異常對象不是託管異常時,it will be wrapped in a RuntimeWrappedException

爲了避免終止您的應用程序,您需要捕獲線程方法「棧頂」處的異常。如果因爲無法訪問代碼而無法實現這一點,則未處理的異常表明存在錯誤的軟件,即使發現軟件錯誤時最好的做法是不方便,也應該終止應用程序以避免損壞。

相關問題