WPF 捕获所有异常

Posted

技术标签:

【中文标题】WPF 捕获所有异常【英文标题】:WPF catch all exceptions 【发布时间】:2018-11-01 15:17:19 【问题描述】:

我正在尝试在我的 WPF 应用程序中捕获所有异常。我尝试了以下代码,但它不起作用我不知道为什么?

<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>

App.xaml.cs

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 ex)
    
        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);
    

稍后,我会将所有异常写入日志表。

【问题讨论】:

不是每个异常都有内部异常。 什么不起作用?当你运行你的程序时会发生什么?你预计会发生什么? Globally catch exceptions in a WPF application?的可能重复 【参考方案1】:

正如@Udontknow 在他的评论中指出的那样,并非每个异常都有内部异常。此外,例如,可能存在 两个 内部异常。因此,要正确收集所有异常,您可以使用以下帮助程序GetAllExceptions扩展方法:

public static class ExtensionMethods

    public static string GetAllExceptions(this Exception ex)
    
        int x = 0;
        string pattern = "EXCEPTION #0:\r\n1";
        string message = String.Format(pattern, ++x, ex.Message);
        Exception inner = ex.InnerException;
        while (inner != null)
        
            message += "\r\n============\r\n" + String.Format(pattern, ++x, inner.Message);
            inner = inner.InnerException;
        
        return message;
    

示例:

try

    throw new Exception("Root Error", innerException: new Exception("Just inner exception"));

catch(Exception ex)

    WriteLine(ex.GetAllExceptions());

输出:

EXCEPTION #1:
Root Error
============
EXCEPTION #2:
Just inner exception

【讨论】:

以上是关于WPF 捕获所有异常的主要内容,如果未能解决你的问题,请参考以下文章

WPF异常捕获三种处理 UI线程, 全局异常,Task异常

如何捕获此 WPF 位图加载异常?

WPF全局异常捕获

wpf 全局异常捕获处理

2022-03-17 WPF面试题 如何在WPF应用程序中全局捕获异常?

C#:捕获混合托管/非托管进程的所有错误/异常