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