我在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爲什麼沒有回答,但是如果他願意重新發布,我想正式給他信任,而不是他需要我肯定的觀點。
再次感謝大家!
我試圖做到這一點,但我們有遺留的COM對象,傾向於拋出意外的異常...以及如果我總是可以告訴你爲什麼我不會擔心這一點。這對用戶來說是一個很小的不便,他們只是重新啓動應用程序,並在下一次通過時使用100次中的99次。爲了提供更多反饋,我希望提供一些內容,以便我可以更新代碼,以便將來更加優雅地處理這些意外問題。 – MattB