2010-04-12 56 views
2

我正在研究一下如何在.NET中管理未處理的異常,並且我收到了意想不到的結果,我想與大家分享一下,看看您有什麼想法。在.Net 2.0中捕獲未處理的異常。錯誤的事件叫做

第一個看起來很簡單。我寫了這個代碼,做測試,只是拋出創建窗體在同一線程上的異常按鈕:

Public Class Form1 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Throw New Exception() 
    End Sub 

    Private Sub UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs) 
     MsgBox(String.Format("Exception: {0}. Ending: {1}. AppDomain: {2}", CType(e.ExceptionObject, Exception).Message, e.IsTerminating.ToString(), AppDomain.CurrentDomain.FriendlyName)) 
    End Sub 

    Private Sub UnhandledThreadException(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs) 
     MsgBox(String.Format("Exception: {0}. AppDomain: {1}", e.Exception.Message(), AppDomain.CurrentDomain.FriendlyName)) 
    End Sub 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledException 
     AddHandler Application.ThreadException, AddressOf UnhandledThreadException 
    End Sub 
End Class 

當我執行的Visual Studio中的UnhandledException中的代碼按預期的方式調用,但是當我而是從Windows執行應用程序而不是調用UndhanledThreadException。 ¿?¿?¿¿?¿?

有人對這裏會發生什麼有所瞭解嗎?

在此先感謝。

編輯:在閱讀Application.ThreadException documentation看起來像Application.ThreadException異常發生在「Windows窗體線程」(無論它們是什麼,恕我直言,每個應用程序只有一個Windows窗體線程)內發生。所以Application.ThreadException與創建應用程序的表單的線程拋出的異常相關,而其他異常則由AppDomain.CurrentDomain.UnhandledException處理。

回答

2

是的,這是正常的。在調試器下運行時,Application.ThreadException捕獲器被禁用。這樣做可以讓您輕鬆診斷異常。要使其表現相同,您必須致電Application.SetUnhandledExceptionMode() method。不幸的是,在VB.NET項目中很難做到,你必須禁用應用程序框架。

不值得麻煩,如果要測試異常處理代碼,請按Ctrl + F5。

+0

調試處理代碼沒有問題,這只是我沒有發現任何有關該事實的文檔。無論如何,只是嘗試了SetUnHandledException並且處理程序不會被調用,因爲執行停止在異常原點並且不能繼續。 – 2010-04-12 13:17:13