Захват необработанных исключений в.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, если вы хотите проверить код обработки исключений.