2009-08-03 138 views
0

我有一個混合Winforms和WPF的應用程序。在的WinForms,我有如下定義一個全局異常處理程序:爲什麼我的異常被捕獲

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
Application.ThreadException += Application_ThreadException; 

這總是在我的應用程序發生未預期的和正常處理捕獲異常的任何地方。

對於WPF,我似乎能夠捕捉到的是:

wpfAppDomain = new System.Windows.Application(); 
wpfAppDomain.DispatcherUnhandledException += 
     wpfAppDomain_DispatcherUnhandledException; 

這並不總是趕上全球例外,我經常發現異常吞嚥的地方,我不知道爲什麼。

如何爲WPF創建一個全局異常處理程序,以便捕獲發生未處理的異常?

+0

您是在Visual Studio中還是在可執行文件中測試它? Visual Studio將嘗試捕獲一些異常並中斷您的應用程序執行。 – Zyphrax 2009-08-03 20:00:39

+3

誰拋出了這個異常?如果約翰Skeet做了,你不能抓住它的人;) – amazedsaint 2009-08-04 07:13:30

回答

1

有幾種情況下,該代碼將無法捕捉異常,並通過設計

  • 這樣做的唯一的例外是根本抓不到。例如,運行時拋出StackOverflowException
  • 在您的代碼中未處理的異常,但在覈心的WPF框架中。

沒有辦法捕捉所有拋出的異常。這樣做會讓你違反應該始終工作的代碼的語義。

0

您是否在撥打SetUnhandledExceptionMode後試過?就像這樣:

// Force all exceptions through our handler. 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
0

DispatcherUnhandledException僅捕獲從調度員(如顧名思義)稱爲碼異常事件,它應該可以捕捉到WPF代碼調用時拋出的異常。

它不包括從WinForms,BackgroundWorker,您自己創建的線程池或線程拋出的異常。

你仍然可以使用AppDomain.CurrentDomain.UnhandledException來捕獲這些。