2011-11-25 57 views
1

在我的App.xaml.cs中,我有處理DispatcherUnhandledExceptions(UI線程)和UnhandledException(非UI線程)的事件。當我在dispatcher.Invoke中拋出異常時,dispatcherhandler捕獲異常並處理它。記錄異常之後,我將e.Handled設置爲true。現在奇怪的行爲,如果我拋出調度程序之外的異常。調用作爲一個regualr統計,控制發送到調度程序異常處理程序,但方法處理後,應用程序基本上失去控制,但我可以告訴它仍然運行通過尋找在停止按鈕中與應用程序在處理UnhandledException後進入未知/鎖定狀態

還有一件事,如果我將e.handled設置爲false,控件將發送到非UI線程異常處理程序。

那麼,爲什麼在Dispatcher處理程序中處理異常之後,應用程序被鎖定呢?

這裏是我的代碼

private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    { 
     // log exception here 
     e.Handled = true; 
    } // control is lost after executing this block 

    private void App_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     try 
     { 
      Exception ex = e.ExceptionObject as Exception;     
      // log exception here 
     } 
     finally 
     { 
      Environment.Exit(-1); 
     } 

    } 

回答

1

的UnhandledException意味着你的應用程序也死了。如果你得到這個事件,那麼爲了從這個場景中恢復而做任何事情都爲時已晚。通常,您只會使用此事件來記錄錯誤以進行調試,並嘗試清理一些非託管資源。

以下article給出了WPF中異常處理的詳細說明。

+0

但爲什麼應用程序在執行e.handled = true後進入植物狀態?在我的窗口構造函數中,我拋出異常,拋出新的異常(「一些異常」)。控件發送到dispatcherUnhandledException處理程序,但該應用程序仍然繼續運行。 – Syler

+0

我不會推薦從窗口構造函數中拋出異常。相反,將您的邏輯放入Initialized或Loaded事件中,然後將自己殺死爲一個窗口。 –

0

如果在OnStartup事件之後引發異常,應用程序似乎能夠恢復操作,如果在兩者之間引發異常,則會捕獲並處理異常,但主窗口永遠不會顯示調試器會顯示應用程序運行。

我發現的最接近的解決方案是從主窗口的構造函數中刪除複雜的邏輯,以允許onstartup事件執行並在我的MainWindow加載事件中執行大量加載。

相關問題