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}");
  }
posted @ 2024-05-29 11:26  Hey,Coder!  阅读(194)  评论(0)    收藏  举报