WPF捕獲未處理的異常

   WPF程序中,對於異常的捕獲通常使用try/catch塊。就像程序中的bug同樣,很難保證程序中全部的異常都可以經過try/catch捕獲。若是異常沒有被捕獲,輕則影響用戶體驗,嚴重時會致使數據丟失。WPF中提供了Application.DispatcherUnhandledException事件和AppDomain.UnhandledException事件,經過註冊這兩個事件,咱們能夠對未經處理的全局異常集中執行自定義處理。spa

  對於在主UI線程上運行的代碼未處理的每一個異常,Application都將引起一個 DispatcherUnhandledException。當您處理一個來自 DispatcherUnhandledException 的未經處理的異常,而且不但願 WPF 繼續處理該異常時,須要將 Handled 屬性設置爲 true。通俗的講,若是不但願應用程序崩潰,咱們須要將Handled 屬性設置爲 true。但不是全部的異常均可恢復,若是異常是FileNotFoundException,程序能夠在處理異常後繼續運行,若是異常是StackOverflowException,則沒法再繼續運行,即將關閉。線程

  對於在任何線程中的任何未處理的異常,以及不管什麼應用程序域中的異常都將引起UnhandledException。若是UI線程中的異常未處理,也會引起UnhandledException。從.NET Framework 4開始,損壞進程狀態異常將不引起該事件,如堆棧溢出,或者是訪問衝突。由於默認狀況下,公共語言運行時 (CLR) 並不把這些異常輸出到託管代碼,且不爲它們調用 try/catch 塊。code

  奉上簡單代碼:blog

 1      /// <summary>
 2         /// 應用程序啓動  3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void Application_Startup(object sender, StartupEventArgs e)  7  {  8             Current.DispatcherUnhandledException += App_OnDispatcherUnhandledException;  9             AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 10  } 11 
12         /// <summary>
13         /// UI線程拋出全局異常事件處理 14         /// </summary>
15         /// <param name="sender"></param>
16         /// <param name="e"></param>
17         private void App_OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 18  { 19             try
20  { 21                 LogHelper.Instance.Logger.Error(e.Exception, "UI線程全局異常"); 22                 e.Handled = true; 23  } 24             catch (Exception ex) 25  { 26                 LogHelper.Instance.Logger.Error(ex, "不可恢復的UI線程全局異常"); 27                 MessageBox.Show("應用程序發生不可恢復的異常,將要退出!"); 28  } 29  } 30 
31         /// <summary>
32         /// 非UI線程拋出全局異常事件處理 33         /// </summary>
34         /// <param name="sender"></param>
35         /// <param name="e"></param>
36         private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 37  { 38             try
39  { 40                 var exception = e.ExceptionObject as Exception; 41                 if (exception != null) 42  { 43                     LogHelper.Instance.Logger.Error(exception, "非UI線程全局異常"); 44  } 45  } 46             catch (Exception ex) 47  { 48                 LogHelper.Instance.Logger.Error(ex, "不可恢復的非UI線程全局異常"); 49                 MessageBox.Show("應用程序發生不可恢復的異常,將要退出!"); 50  } 51         }
相關文章
相關標籤/搜索