Захват необработанных исключений в.Net 2.0. Неправильное событие называется

Я немного изучаю, как обрабатываются необработанные исключения в.Net, и получаю неожиданные результаты, которыми я хотел бы поделиться с вами, чтобы узнать, что вы думаете.

Первый довольно просто увидеть. Я написал этот код для выполнения теста, просто кнопку, которая вызывает исключение в том же потоке, который создал форму:

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 выглядит как Application.ThreadException, когда исключения возникают внутри "потоков Windows Forms" (какими бы они ни были, IMHO, в каждом приложении есть только один поток Windows Form). Поэтому Application.ThreadException относится к исключениям, создаваемым потоком, который создал форму вашего приложения, а другие исключения обрабатываются AppDomain.CurrentDomain.UnhandledException.

1 ответ

Решение

Да, это нормально. Ловец Application.ThreadException отключается при запуске под отладчиком. Это сделано, чтобы вы могли легко диагностировать исключения. Чтобы заставить его вести себя так же, вы должны вызвать метод Application.SetUnhandledExceptionMode(). К сожалению, это трудно сделать в проекте VB.NET, вы должны отключить каркас приложения.

Не стоит беспокоиться, нажмите Ctrl+F5, если вы хотите проверить код обработки исключений.

Другие вопросы по тегам