在WPF (Windows Presentation Foundation) 应用程序中,你可以使用 AppDomain.CurrentDomain.UnhandledException
事件来全局捕获未处理的异常。这个事件会在应用程序中的任何地方发生未处理的异常时触发。以下是一个简单的例子,演示如何在WPF应用程序中全局捕获异常:
using System;
using System.Windows;namespace WpfExceptionHandling
{public partial class App : Application{protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);// 订阅未处理异常事件AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;// 启动主窗口MainWindow mainWindow = new MainWindow();mainWindow.Show();}private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e){// 处理未处理的异常Exception exception = e.ExceptionObject as Exception;if (exception != null){// 在这里可以添加日志记录、用户通知等处理逻辑MessageBox.Show($"发生未处理的异常:\n\n{exception.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);}}}
}
在上述示例中,OnStartup
方法被重写以便在应用程序启动时订阅 AppDomain.CurrentDomain.UnhandledException
事件。当未处理的异常发生时,CurrentDomain_UnhandledException
方法会被调用,你可以在这里添加你的自定义处理逻辑,比如记录日志或向用户显示错误信息。
请注意,虽然使用 AppDomain.CurrentDomain.UnhandledException
可以捕获大多数未处理的异常,但它不能捕获在UI线程上的所有异常。对于UI线程上的异常,你可能还需要处理 Application.DispatcherUnhandledException
事件。
除了使用 AppDomain.CurrentDomain.UnhandledException
事件外,你还可以考虑使用其他一些高级的异常处理方法,这取决于你的应用程序的具体需求。以下是一些可能的高级用法:
-
使用
Application.DispatcherUnhandledException
事件:protected override void OnStartup(StartupEventArgs e) {base.OnStartup(e);// 订阅UI线程上的未处理异常事件DispatcherUnhandledException += App_DispatcherUnhandledException;// 启动主窗口MainWindow mainWindow = new MainWindow();mainWindow.Show(); }private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) {// 处理UI线程上的未处理异常// 可以选择取消异常,阻止应用程序崩溃e.Handled = true;// 在这里可以添加日志记录、用户通知等处理逻辑MessageBox.Show($"发生未处理的UI线程异常:\n\n{e.Exception.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); }
-
使用异步异常处理:
如果你的应用程序使用异步编程,可以考虑使用TaskScheduler.UnobservedTaskException
事件来捕获未观察到的任务异常:protected override void OnStartup(StartupEventArgs e) {base.OnStartup(e);// 订阅未观察到的任务异常事件TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;// 启动主窗口MainWindow mainWindow = new MainWindow();mainWindow.Show(); }private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) {// 处理未观察到的任务异常// 可以选择取消异常,阻止应用程序崩溃e.SetObserved();// 在这里可以添加日志记录、用户通知等处理逻辑MessageBox.Show($"发生未观察到的任务异常:\n\n{e.Exception.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); }
这些方法提供了更多的灵活性,允许你更细粒度地处理不同类型的异常。根据你的应用程序的特定需求,你可以选择一个或多个适合的异常处理方法。