例如点击了用户界面上面的某个控件

时间:2021-10-01 09:20:32

  在WPF开发过程中我们一般都用try/catch块来捕获异常,但不是每个异常我们都能捕获,措施总会呈现一些意想不到情况,抛出一些未捕获的异常,这时就要用到全局异常捕获,即在措施的最外层加上捕获未措置惩罚惩罚异常,以免措施奔溃,影响用户体验。  

  在WPF应用措施中,会有两大类未措置惩罚惩罚异常:一类是在UI线程抛出来的,例如点击了用户界面上面的某个控件,然后执行某个代码的时候,遇到了异常;另一类长短UI线程跑出来的,例如在一个多线程的措施里面,事情线程的代码遇到了异常。

对付UI线程的未措置惩罚惩罚异常,我们用Application.DispatcherUnhandledException事件来措置惩罚惩罚,对付非UI线程的未措置惩罚惩罚异常用AppDomain.UnhandledException事件来措置惩罚惩罚,对付Task内未措置惩罚惩罚异常用TaskScheduler.UnobservedTaskException事件来措置惩罚惩罚;

下面看代码:

public App() { //首先注册开始和退掉事件 this.Startup += new StartupEventHandler(App_Startup); this.Exit += new ExitEventHandler(App_Exit); }

启动事件对应的要领:

void App_Startup(object sender, StartupEventArgs e) { //UI线程未捕获异常措置惩罚惩罚事件 this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
       //Task线程内未捕获异常措置惩罚惩罚事件
       TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
//非UI线程未捕获异常措置惩罚惩罚事件 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler( CurrentDomain_UnhandledException); }

退掉事件对应的要领:

void App_Exit(object sender, ExitEventArgs e) { //措施退出时需要措置惩罚惩罚的业务 }

具体对应的要领:

void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { try { e.Handled = true; //把 Handled 属性设为true,暗示磁异常已措置惩罚惩罚,措施可以继续运行,,不会强制退出 MessageBox.Show("捕获未措置惩罚惩罚异常:" + e.Exception.Message); } catch (Exception ex) { //此时措施呈现严重异常,将强制结束退出 MessageBox.Show("措施产生致命错误,将终止,请联系运营商!"); } } void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { StringBuilder sbEx = new StringBuilder(); if (e.IsTerminating) { sbEx.Append("措施产生致命错误,将终止,请联系运营商!\n"); } sbEx.Append("捕获未措置惩罚惩罚异常:"); if (e.ExceptionObject is Exception) { sbEx.Append(((Exception)e.ExceptionObject).Message); } else { sbEx.Append(e.ExceptionObject); } MessageBox.Show(sbEx.ToString()); Loger.WriteErrorLog("捕获未措置惩罚惩罚异常:" + e.ExceptionObject); } void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) { //task线程内未措置惩罚惩罚捕获 MessageBox.Show("捕获线程内未措置惩罚惩罚异常:" + args.Exception.Message); Loger.WriteErrorLog("捕获线程内未措置惩罚惩罚异常:" + args.Exception); args.SetObserved();//设置该异常已察觉(这样后就不会引起措施瓦解) }

 

WPF捕获全局未措置惩罚惩罚异常