您的位置:首页 > 其它

WPF中未捕获异常之处理

2010-03-19 11:00 232 查看
异常有两类,一类是主线程异常,另一类是工作线程异常。

一:主线程的未捕获异常处理起来比较简单

1:首先在APP.XAML中定义一个DispatcherUnhandledException事件,如

<Application x:Class="CET.ExamViewer.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="WinMain.xaml"
DispatcherUnhandledException="App_DispatcherUnhandledException" >
<Application.Resources>

</Application.Resources>
</Application>


2:其次,事件函数可以如下:

void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendFormat("应用程序出现了未捕获的异常,{0}/n", e.Exception.Message);
if (e.Exception.InnerException != null)
{
stringBuilder.AppendFormat("/n {0}", e.Exception.InnerException.Message);
}
stringBuilder.AppendFormat("/n {0}", e.Exception.StackTrace);
MessageBox.Show(stringBuilder.ToString());
e.Handled = true;
}


二:工作线程异常的捕获

对于工作线程的未捕获异常,也就是你主线程中,新起了一个线程,然后这个线程抛出的异常。如果你不做特殊处理,则光靠DispatcherUnhandledException是捕获不了的。

所以,我们就要对工作线程的异常进行重新包装。事实上,也就是用到了WPF中的主线程的Dispatcher。如下代码:

public void 工作函数()
{
try
{
some code may be throw new Exception("我是工作线程的异常信息");
}
catch (Exception ex)
{
PageMain.GetInstance().Dispatcher.Invoke((MethodInvoker)delegate
{
throw ex;
});
}
}


注意,上面代码中的PageMain.GetInstance().Dispatcher,就是获取主线程(也即主页面的)的Dispatcher。PageMain.GetInstance()就是主页面的一个单例,想必大家都已经很清楚如何实现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: