免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
關(guān)于未捕獲異常的處理(WPF)
標(biāo)簽: wpf
2014-06-20 10:11 275人閱讀 評(píng)論(0) 收藏 舉報(bào)
分類:

http://www.cnblogs.com/chenxizhang/p/3280947.html

這一篇文章來談?wù)剬?duì)于WPF應(yīng)用程序開發(fā)中的未捕獲異常的處理。

首先,我們當(dāng)然是要求應(yīng)用程序開發(fā)人員,盡可能地在程序可能出現(xiàn)異常的地方都去捕捉異常,使用try…catch的方式。但是總是有一些意外的情況可能會(huì)發(fā)生,這就導(dǎo)致會(huì)出現(xiàn)所謂的“未捕獲異常(UnhandledException)”。對(duì)于這一類異常,如果我們沒有一個(gè)合適的策略進(jìn)行處理,則當(dāng)其發(fā)生的時(shí)候,會(huì)給用戶帶來不太好的使用體驗(yàn)。例如下面這樣

備注:這個(gè)截圖是在Windows 8上面做的,其他操作系統(tǒng)看到的界面可能略有不同。

用戶看到這個(gè)窗口的時(shí)候,其實(shí)一般只能點(diǎn)擊Close the prograrm按鈕。也就是說,這種情況下會(huì)導(dǎo)致用戶無法繼續(xù)使用這個(gè)程序,而且他們還得不到任何具體的消息:到底發(fā)生了什么事情了?除非他們?nèi)ゲ榭碬indows的事件日志。(但一般的用戶是不太會(huì)這個(gè)操作的)

我們可以看到在Windows事件日志中,會(huì)有兩個(gè)具體的事件。首先是一個(gè).NET Runtime的事件

然后是一個(gè)Application Error的事件

通常來說,這樣的用戶體驗(yàn)有值得改進(jìn)的地方。我們雖然不能防止異常的產(chǎn)生,但是當(dāng)意外發(fā)生的時(shí)候,我們應(yīng)該要以更好地方式地通知到用戶,或者盡可能地不要影響用戶當(dāng)前的操作。

 

在WPF這種應(yīng)用程序中,會(huì)有兩大類未處理異常:一類是在UI線程拋出來的,例如點(diǎn)擊了用戶界面上面的某個(gè)控件,然后執(zhí)行某個(gè)代碼的時(shí)候,遇到了異常;另一類是非UI線程跑出來的,例如在一個(gè)多線程的程序里面,工作線程的代碼遇到了異常。

對(duì)于UI線程的未處理異常,我們可以通過監(jiān)控下面這個(gè)事件來處理

Application.Current.DispatcherUnhandledException   http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx

一個(gè)參考代碼如下:

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)終止,請(qǐng)進(jìn)行重試,如果問題繼續(xù)存在,請(qǐng)聯(lián)系管理員.", "意外的操作", MessageBoxButton.OK, MessageBoxImage.Information);//這里通常需要給用戶一些較為友好的提示,并且后續(xù)可能的操作            e.Handled = true;//使用這一行代碼告訴運(yùn)行時(shí),該異常被處理了,不再作為UnhandledException拋出了。        }    }}

運(yùn)行的效果大致如下

 

對(duì)于非UI線程拋出的未處理異常,我們需要監(jiān)控另外一個(gè)事件來處理

AppDomain.CurrentDomain.UnhandledException  http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx 

一個(gè)參考代碼如下

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)終止,請(qǐng)進(jìn)行重試,如果問題繼續(xù)存在,請(qǐng)聯(lián)系管理員.", "意外的操作", MessageBoxButton.OK, MessageBoxImage.Information);        }    }}

 

令人不解的是,這個(gè)事件中沒有和前面那個(gè)事件一樣的e.Handled參數(shù),就是說,雖然這樣是可以捕捉到非UI線程的異常,而且也可以進(jìn)行相應(yīng)的處理,但是應(yīng)用程序還是會(huì)退出,也就是說這個(gè)異常還是被當(dāng)作是未處理異常繼續(xù)匯報(bào)給Runtime。

為了改進(jìn)這一點(diǎn),我們可以通過修改配置文件來實(shí)現(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的話,用意是使用早期版本的異常處理策略。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
異常處理之ThreadException、unhandledException及多線程異常處理
Unity手游崩潰異常如何捕獲
為您的Java應(yīng)用程序添加退出事件處理
WinForm如何優(yōu)雅的處理異常
WPF學(xué)習(xí)與分享之二:DispatcherObject與WPF線程模型(上)
WPF 基礎(chǔ)到企業(yè)應(yīng)用系列3——Dispatcher及多線程
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服