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 }