我在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();
}
答案 0 :(得分:4)
这可能是因为你有调试器处理异常的方式 - 调试/例外......应该允许你准确配置你想要的处理方式。
答案 1 :(得分:3)
请看以下msdn链接http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx 以下是相关的
如果在后台用户界面(UI)线程(具有自己的Dispatcher的线程)或后台工作线程(没有Dispatcher的线程)上未处理异常,则不会将异常转发到主UI线程。因此,不会引发DispatcherUnhandledException。在这些情况下,您需要编写代码来执行以下操作:
答案 2 :(得分:2)
首先,即使在调试环境之外,我的处理程序似乎没有触发.....然后我意识到我忘了设置e.Handled = true。
事实上它是有效的但是因为e.Handled仍然是假的,标准的异常处理程序仍然开始并做了它的事情。
一旦我设置e.Handled = true,那么一切都是笨拙的。因此,如果它不适合您,请确保您已完成该步骤。
答案 3 :(得分:2)
这就是我处理它的方式。这不是很好,但请记住,这种类型的错误永远不应该作为开发人员进行调试。在你去生产之前,这些错误应该很长时间才能得到解决(所以可以说这不错)。在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);
}
}
答案 4 :(得分:1)
对于那些感兴趣的人
似乎IDE仍在打破异常,如果在IDE中单击“继续”,则会调用错误处理程序。