wpf 捕获全局异常
注意
需要确保程序的关闭逻辑设置正确,在App.xaml.cs的启动逻辑中设置只有明确调用退出时才会关闭程序,否则异常逻辑触发会导致程序闪退没有被捕获。
this.ShutdownMode = ShutdownMode.OnExplicitShutdown;
另外需要补充一个明确关闭程序的逻辑,例如在主窗口关闭时退出程序
public partial class MainWindow : Window
{
private VMMain model;
public MainWindow()
{
InitializeComponent();
this.DataContext = model = new VMMain();
this.Closed += MainWindow_Closed;
}
private void MainWindow_Closed(object? sender, EventArgs e)
{
Application.Current.Shutdown();
}
}
App()
{
this.Startup += App_Startup;
}
private void App_Startup(object sender, StartupEventArgs e)
{
this.DispatcherUnhandledException += App_DispatcherUnhandledException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
}
//主线程未处理异常
private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
//HandyControl.Controls.Growl.Error($"应用程序遇到未处理的异常:{e.Exception.Message}");
e.Handled = true;
}
//未处理线程异常(如果主线程未处理异常已经处理,该异常不会触发)
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
if (e.ExceptionObject is Exception ex)
{
//HandyControl.Controls.Growl.Error($"应用程序遇到未处理的异常:{ex.Message}");
}
}
//未处理的Task内异常
private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
//HandyControl.Controls.Growl.Error($"应用程序遇到未处理的异常:{e.Exception.Message}");
}
留待后查,同时方便他人
联系我:renhanlinbsl@163.com
联系我:renhanlinbsl@163.com