繁体   English   中英

WPF如何处理异常并继续

[英]WPF how to handle Exceptions and continue

我最初有代码来处理DispatcherUnhandledException ,它会记录错误并将异常标记为已处理

protected override void OnStartup(StartupEventArgs e)
{
    Dispatcher.UnhandledException += OnDispatcherUnhandledException;
}
...
void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    // Log Error here
    e.Handled = true;
}

我试图通过涵盖更广泛的未处理异常来改善这一点

    protected override void OnStartup(StartupEventArgs e)
    {
         AppDomain.CurrentDomain.UnhandledException += (s, ex) =>
         LogUnhandledException((Exception)ex.ExceptionObject, 
        "AppDomain.CurrentDomain.UnhandledException");

         DispatcherUnhandledException += (s, ex) =>
         LogUnhandledException(ex.Exception, 
         "Application.Current.DispatcherUnhandledException");

         TaskScheduler.UnobservedTaskException += (s, ex) =>
         LogUnhandledException(ex.Exception, 
         "TaskScheduler.UnobservedTaskException");
    }

但我无法使用此事件处理异常

    private void LogUnhandledException(Exception e, string @event)
    {
      // Log Error here
      e.Handled = true; //Doesn't work
    }

我如何处理所有类型的异常,以便代码尝试继续?

坦率地说,在我看来,你的整个设计都是个坏主意。 在我看来,您希望能够通过记录它们并让程序继续执行来“处理”这些异常。 但这是一种非常危险的方法,绝对不推荐。 您应该只捕获并处理,而您知道异常提前的例外是什么和如何处理它是安全的方式。

否则就是冒着使程序处于未知状态的风险,从而导致从(最好)有缺陷的行为到(最坏的情况)永久性地破坏用户重要数据的状态。

另请参阅您是否应该捕获所有异常?

但是,假设您无论如何都要执行此操作,您将无法使用LogUnhandledException()方法在事件args中设置Handled属性,因为每个事件都是不同的。 只有DispatcherUnhandledException事件甚至具有要设置的Handled属性。 UnobservedTaskException具有可以设置的Observed属性, AppDomain.UnhandledException事件甚至没有类似的属性。

但是,您当然可以专门处理每个处理程序。 例如:

protected override void OnStartup(StartupEventArgs e)
{
     AppDomain.CurrentDomain.UnhandledException += (s, ex) =>
     LogUnhandledException((Exception)ex.ExceptionObject, 
    "AppDomain.CurrentDomain.UnhandledException");

     DispatcherUnhandledException += (s, ex) =>
     {
         LogUnhandledException(ex.Exception, 
         "Application.Current.DispatcherUnhandledException");
         ex.Handled = true;
     };

     TaskScheduler.UnobservedTaskException += (s, ex) =>
     {
         LogUnhandledException(ex.Exception, 
         "TaskScheduler.UnobservedTaskException");
         ex.SetObserved();
     };
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM