Я выполняю процедуру для обработки AppDomain.CurrentDomain.UnhandledException
и Application.ThreadException
.Я просто извлекаю Message
и StackTrace
из исключения и регистрирую его сейчас.
(Примечание: StackTrace
выглядит все красиво отформатированным с разрывами строк и тому подобным в IDE, но когдаToString
вызывается на нем, теряет форматирование, и я не могу понять, как это исправить.)
Итак, у меня есть следующий код для проверки этого:
Private Sub frmMain_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
'if you don't remove the handlers you'll leak memory
RemoveHandler AppDomain.CurrentDomain.UnhandledException, AddressOf ErrorProcesser.UnhandledException
RemoveHandler Application.ThreadException, AddressOf ErrorProcesser.UnhandledException
End Sub
Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf ErrorProcesser.UnhandledException
AddHandler Application.ThreadException, AddressOf ErrorProcesser.UnhandledException
End Sub
Private Sub btnException_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnException.Click
Throw New Exception("Test Exception - Main Thread", New Exception("Inner Exception Data - Main Thread"))
End Sub
Private Sub btnThreadingException_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThreadingException.Click
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
'this will be in e.Errors in the RunWorkerCompleted
Throw New Exception("Test Exception - Spawned Thread", New Exception("Inner Exception Data - Spawned Thread"))
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Throw New Exception("Test Exception - Returned Thread", New Exception("Inner Exception Data - Returned Thread"))
End Sub
Сейчаскогда я просматриваю свой журнал, я вижу одну запись для «Test Exception - Main Thread» с заполненным StackTrace
и другую запись для «Inner Exception Data - Returned Thread» с NULL для StackTrace
.То, что я ожидаю, - это одна запись для «Test Exception - Main Thread» с заполненным StackTrace
и другая запись для «Test Exception - Returned Thread» с заполненным StackTrace
.
Почему Exception
выброшено из RunWorkerCompleted
только зарегистрировано как InnerException
вместо Exception
как в первом случае?Я убедился, что один и тот же код обрабатывает оба этих вызова.