2014-03-28 24 views
0

我在ApplicationEvents.vb的文件下面的代碼趕上UnhandledExceptionsUnhandledException事件處理程序不要再追ThreadException

Namespace My 

    Partial Friend Class MyApplication 

     Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException 
      MessageBox.Show("error") 
     End Sub 

    End Class 

End Namespace 

然而,這不趕在其他線程發生的異常,ThreadExceptions。我確實在其他線程和其他方法中有一些錯誤處理來防止和解決錯誤,但是我希望在應用程序意外失敗時提供用於調試目的的信息。由於我在ApplicationEvents文件中的錯誤處理沒有考慮到這些,我可以做些什麼來爲一般的ThreadExceptions提供一些信息?

編輯:

我已經試過漢斯的解決方案下面,但沒有骰子不幸。我有代碼,因爲他寫得或多或少,只是消息框不同。當我得到它的工作,我可能會添加一個錯誤日誌或讓它發送消息到我們的支持收件箱。無論如何,這是我的。附加到按鈕我有一個小的子啓動一個新線程,會因測試的目的異常:

Private Sub Label2_Click(ByVal sender As System.Object, VyVal e As System.EventArgs) Handles Label2.Click 
    Dim newThread As New Thread(AddressOf ErrorThread) 
    newThread.Start() 
End Sub 

Private Sub ErrorThread() 
    Throw New System.NullReferenceException 
End Sub 

不幸的是,下面描述的方法不是很努力呢。我希望這會被捕獲,但應用程序仍然失敗。

編輯:

雛龍,漢斯刪除他的回答......我不知道爲什麼,但在被徹底的我會後,我正與現在使用的代碼和簡要說明興趣當我通過一步發生了什麼:

在ApplicationEvents.vb的文件:

Partial Friend Class MyApplication 
    Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As ApplicationServices.StartupEventArgs) Handles Me.Startup 
     If Not System.Diagnostics.Debugger.IsAttached Then 
      AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf AllUnhandledExceptions 
     End If 
    End Sub 

    Private Sub AllUnhandledExceptions(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs) 
     Dim ex = DirectCast(e.ExceptionObject, Exception) 
     MessageBox.Show("Message" & ex.innerException.ToString, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex)) 
    End Sub 

    Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException 
     AllUnhandledExceptions(sender, New UnhandledExceptionEventArgs(e.Exception, True)) 
    End Sub 

End Class 

這就是我的工作,此刻,所有的信用漢斯帕桑特你爲我那麼遠。這是我一步一步發生的事情。啓動處理程序運行,其他代碼運行,並顯示錶單。點擊表單上的按鈕可以讓我瀏覽生成新線程的代碼(通常我使用任務,但在這種情況下,我只是解僱了一個線程,相同的區別,不同的實現,據我所知,任務更靈活)它開始並拋出null ref異常。執行進入AllUnhandledExceptions分行和MessageBox.Show行。從該線上擊中F8會使我回到原來的投擲線。 (我已經注意到啓動例程中的If語句能夠像這樣步進)。如果我構建應用程序,它仍然會失敗。 Windows告訴我應用程序必須結束,但不顯示我的消息框。 UI線程中的錯誤仍然會觸發消息框。

任何進一步的想法,提示或技巧,讚賞。再次感謝您的時間和建議每個人。

編輯:工作!漢斯的回答在稍作調整後確實奏效。細節稍後發佈...

所以,如果任何人都可以更深入地解釋爲什麼這個微小的變化後,這個工作。我都是耳朵。在調試過程中,我發現了以下內容,而且我有點尷尬,我沒有趕上它:

正如預期的那樣,在新線程上拋出異常後,執行過程會轉到AllUnhandledExceptions子。然而,當我在調試中繞過我的代碼時,我終於發現了一些東西 - 行Dim ex = DirectCast(e.ExceptionObject, Exception)導致對象引用ex未被設置爲對象的實例。我意識到,我得到的空引用異常不是我原來的空引用異常,當我嘗試在我的消息框中使用ex.innerexception.ToString時,它是ex上的空引用異常。我切換,而不是使用前,我使用傳遞給子的e對象像這樣:MessageBox.Show(Message & e.ExceptionObject.ToString, "Fatal Error", MessageButtons, MessageIcon)和羅,瞧,它的作品!此外,它適用於在UI線程和新線程上拋出的異常。

所以......這是我的決議。我仍然不確定Hans爲什麼沒有回答,但是如果他願意重新發布,我想正式給他信任,而不是他需要我肯定的觀點。

再次感謝大家!

回答

1

我會確保你的線程正確地處理異常。您的主線程不會在衍生線程中處理未處理的異常。

+0

我試圖做到這一點,但我們有遺留的COM對象,傾向於拋出意外的異常...以及如果我總是可以告訴你爲什麼我不會擔心這一點。這對用戶來說是一個很小的不便,他們只是重新啓動應用程序,並在下一次通過時使用100次中的99次。爲了提供更多反饋,我希望提供一些內容,以便我可以更新代碼,以便將來更加優雅地處理這些意外問題。 – MattB