关于c#:WPF捕获所有异常

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在他的评论中指出的,并不是每个异常都有内部异常。此外,例如,可能有两个内部异常。因此,要正确收集所有异常,可以使用以下助手GetAllExceptions扩展方法:

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
try
{
    throw new Exception("Root Error", innerException: new Exception("Just inner exception"));
}
catch(Exception ex)
{
    WriteLine(ex.GetAllExceptions());
}

输出:

1
2
3
4
5
EXCEPTION #1:
Root Error
============
EXCEPTION #2:
Just inner exception