我在VS2008中启动了一个新的WPF项目,然后添加了一些代码来捕获
DispatcherUnhandledException
。然后我给Window1
添加了一个抛出异常
但错误不会被处理程序捕获。为什么?
public App()
{
this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
}
void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
System.Windows.MessageBox.Show(string.Format("An error occured: {0}", e.Exception.Message), "Error");
e.Handled = true;
}
void Window1_MouseDown(object sender, MouseButtonEventArgs e)
{
throw new NotImplementedException();
}
发生这种情况是因为调试器处理异常的方式 - 调试/异常...应该允许您准确配置您想要的处理方式。
我就是这样处理的。 这不太漂亮,但请记住,这种类型的错误永远不应该让开发人员无法进行调试。 这些错误应该在投入生产之前就得到解决(所以这不太漂亮也没关系)。 在Startup项目中,在App.xaml(App.xaml.cs)代码后面,我放置了以下代码。
我不确定为什么代码块特殊字符没有正确格式化。 对此感到抱歉。
protected override void OnStartup(StartupEventArgs e)
{
// define application exception handler
Application.Current.DispatcherUnhandledException +=
AppDispatcherUnhandledException;
// defer other startup processing to base class
base.OnStartup(e);
}
private void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
runException(e.Exception);
e.Handled = true;
}
void runException(Exception ex)
{
MessageBox.Show(
String.Format(
"{0} Error: {1}\r\n\r\n{2}",
ex.Source, ex.Message, ex.StackTrace,
"Initialize Error",
MessageBoxButton.OK,
MessageBoxImage.Error));
if (ex.InnerException != null)
{
runException(ex.InnerException);
}
}
查看以下msdn链接http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx 以下是相关内容
如果在后台用户界面 (UI) 线程(具有自己的 Dispatcher 的线程)或后台工作线程(没有 Dispatcher 的线程)上未处理异常,则异常不会转发到主 UI 线程。因此,不会引发 DispatcherUnhandledException。在这些情况下,您将需要编写代码来执行以下操作:
起初,即使在调试环境之外,我的处理程序似乎也没有触发......然后我意识到我忘记设置
e.Handled = true
。
事实上它正在工作,但因为
e.Handled
仍然是false
,标准异常处理程序仍然启动并完成它的工作。
一旦我设置了
e.Handled = true
,那么一切都变得很美好。 因此,如果它不适合您,请确保您已完成该步骤。
有兴趣的人
IDE 似乎仍然因异常而中断,如果您在 IDE 中单击“继续”,它会调用错误处理程序。