WPF catch all exceptions
我正在尝试在我的WPF应用程序中捕获所有异常。我试过以下代码,但它不起作用。我不知道为什么?
1 2 3 4 5 6 7 8 9 10 11 | <Application x:Class="DBFilter.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml" Exit="Application_Exit" DispatcherUnhandledException ="AppDispatcherUnhandledException" > <Application.Resources> </Application.Resources> </Application> |
代码文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | protected override void OnStartup(StartupEventArgs e) { AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomainUnhandledExceptionHandler); System.Windows.Forms.Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); Application.Current.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(AppDispatcherUnhandledException); } void AppDomainUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs ea) { Exception ex = (Exception)ea.ExceptionObject; MessageBox.Show(ex.Exception.InnerException.Message); } void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { MessageBox.Show(e.Exception.InnerException.Message); } void AppDispatcherUnhandledException(object sender,DispatcherUnhandledExceptionEventArgs e) { MessageBox.Show(e.Exception.InnerException.Message); } |
稍后,我将把所有异常写入一个日志表。
正如@udontknow在他的评论中指出的,并不是每个异常都有内部异常。此外,例如,可能有两个内部异常。因此,要正确收集所有异常,可以使用以下助手
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public static class ExtensionMethods { public static string GetAllExceptions(this Exception ex) { int x = 0; string pattern ="EXCEPTION #{0}: {1}"; string message = String.Format(pattern, ++x, ex.Message); Exception inner = ex.InnerException; while (inner != null) { message +=" ============ " + String.Format(pattern, ++x, inner.Message); inner = inner.InnerException; } return message; } } |
例子:
1 2 3 4 5 6 7 8 |
输出:
1 2 3 4 5 | EXCEPTION #1: Root Error ============ EXCEPTION #2: Just inner exception |