关于未捕获异常的处理(WPF)
轉(zhuǎn)載自:http://www.cnblogs.com/chenxizhang/p/3280947.html
這一篇文章來談?wù)剬τ赪PF應(yīng)用程序開發(fā)中的未捕獲異常的處理。
首先,我們當(dāng)然是要求應(yīng)用程序開發(fā)人員,盡可能地在程序可能出現(xiàn)異常的地方都去捕捉異常,使用try…catch的方式。但是總是有一些意外的情況可能會發(fā)生,這就導(dǎo)致會出現(xiàn)所謂的“未捕獲異常(UnhandledException)”。對于這一類異常,如果我們沒有一個合適的策略進(jìn)行處理,則當(dāng)其發(fā)生的時候,會給用戶帶來不太好的使用體驗。例如下面這樣
備注:這個截圖是在Windows 8上面做的,其他操作系統(tǒng)看到的界面可能略有不同。
用戶看到這個窗口的時候,其實一般只能點(diǎn)擊Close the prograrm按鈕。也就是說,這種情況下會導(dǎo)致用戶無法繼續(xù)使用這個程序,而且他們還得不到任何具體的消息:到底發(fā)生了什么事情了?除非他們?nèi)?strong>查看Windows的事件日志。(但一般的用戶是不太會這個操作的)
查看Windows的事件日志:https://jingyan.baidu.com/article/91f5db1b057fb61c7e05e375.html
我們可以看到在Windows事件日志中,會有兩個具體的事件。首先是一個.NET Runtime的事件
然后是一個Application Error的事件
通常來說,這樣的用戶體驗有值得改進(jìn)的地方。我們雖然不能防止異常的產(chǎn)生,但是當(dāng)意外發(fā)生的時候,我們應(yīng)該要以更好地方式地通知到用戶,或者盡可能地不要影響用戶當(dāng)前的操作。
?
在WPF這種應(yīng)用程序中,會有兩大類未處理異常:一類是在UI線程拋出來的,例如點(diǎn)擊了用戶界面上面的某個控件,然后執(zhí)行某個代碼的時候,遇到了異常;另一類是非UI線程跑出來的,例如在一個多線程的程序里面,工作線程的代碼遇到了異常。
對于UI線程的未處理異常,我們可以通過監(jiān)控下面這個事件來處理
Application.Current.DispatcherUnhandledException???http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx
一個參考代碼如下:
using System; using System.Windows;namespace WpfApplicationExceptionSample {/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : Application{public App(){Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;}void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e){MessageBox.Show("我們很抱歉,當(dāng)前應(yīng)用程序遇到一些問題,該操作已經(jīng)終止,請進(jìn)行重試,如果問題繼續(xù)存在,請聯(lián)系管理員.", "意外的操作", MessageBoxButton.OK, MessageBoxImage.Information);//這里通常需要給用戶一些較為友好的提示,并且后續(xù)可能的操作e.Handled = true;//使用這一行代碼告訴運(yùn)行時,該異常被處理了,不再作為UnhandledException拋出了。}} }運(yùn)行的效果大致如下
?
對于非UI線程拋出的未處理異常,我們需要監(jiān)控另外一個事件來處理
AppDomain.CurrentDomain.UnhandledException??http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx?
一個參考代碼如下
using System; using System.Windows;namespace WpfApplicationExceptionSample {/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : Application{public App(){AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;}void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e){MessageBox.Show("我們很抱歉,當(dāng)前應(yīng)用程序遇到一些問題,該操作已經(jīng)終止,請進(jìn)行重試,如果問題繼續(xù)存在,請聯(lián)系管理員.", "意外的操作", MessageBoxButton.OK, MessageBoxImage.Information);}} }?
令人不解的是,這個事件中沒有和前面那個事件一樣的e.Handled參數(shù),就是說,雖然這樣是可以捕捉到非UI線程的異常,而且也可以進(jìn)行相應(yīng)的處理,但是應(yīng)用程序還是會退出,也就是說這個異常還是被當(dāng)作是未處理異常繼續(xù)匯報給Runtime。
為了改進(jìn)這一點(diǎn),我們可以通過修改配置文件來實現(xiàn)。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <runtime><legacyUnhandledExceptionPolicy enabled="1"/></runtime><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup> </configuration>?
這里的legacyUnhandledExceptionPolicy,如果enabled=1的話,用意是使用早期版本的異常處理策略。
總結(jié)
以上是生活随笔為你收集整理的关于未捕获异常的处理(WPF)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序开发剖解圣经(006)
- 下一篇: DLL导出类和导出函数