.Net Исключение обрабатывается по-разному, когда из RunWorkerCompleted (не относится к исключениям DoWork) - PullRequest
0 голосов
/ 17 января 2011

Я выполняю процедуру для обработки 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 как в первом случае?Я убедился, что один и тот же код обрабатывает оба этих вызова.

...