Я наследую свой класс от формы, в которой есть обработчик для FormClosing (его можно переопределить, поэтому я могу переопределить его и выполнить MsgBox ("Ha") перед вызовом базового метода).В моем Shared Sub New () у меня есть:
' Add the event handler for handling UI thread exceptions to the event.
AddHandler Application.ThreadException, AddressOf Application_ThreadException
' Add the event handler for handling non-UI thread exceptions to the event.
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException
'For Console applications you should use the System.AppDomain.UnhandledException event
AddHandler Thread.GetDomain().UnhandledException, AddressOf CurrentDomain_UnhandledException
Если я выбрасываю исключение в моей форме вне попытки / улова, я замечаю два разных поведения:
- ЕслиЯ использую отладчик VS Я получаю необработанное исключение, и кажется, что мой обработчик необработанного исключения вызван.Кажется, что обработчик события formClosing не вызывается.
- Если я НЕ использую отладчик VS, то вызывается обработчик FormClosing, но не вызывается обработчик необработанного исключения.
Я не могу понять, почему не обрабатываются обработчики необработанного исключениявызывается в # 2.В идеале я хотел бы (в обоих случаях) иметь вызов Unhandled Exception, а затем вызывать обработчик события FormClosing.Чего мне не хватает?
(НЕКОТОРЫЙ ОБРАЗЕЦ КОДА) - ЭТО демонстрирует, как генерируются различные исключения, если вы запускаете с использованием отладчика в VS (просто нажимая F5) или когда вы запускаете без отладчика (просто нажимая CTRL-F5)).Это не может точно воспроизвести проблему, но, возможно, моя проблема связана с тем, что ThreadException по-разному обрабатывается базовым классом.
Form1 (Установить в качестве запуска в вашем проекте).
Imports System.Threading
Public Class Form1
Inherits Form2
Shared Sub New()
' Add the event handler for handling UI thread exceptions to the event.
AddHandler Application.ThreadException, AddressOf Application_ThreadException
' Add the event handler for handling non-UI thread exceptions to the event.
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException
End Sub
Private Shared Sub CurrentDomain_UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
MsgBox("UnhandledException caught")
End Sub
Private Shared Sub Application_ThreadException(ByVal sender As Object, ByVal e As ThreadExceptionEventArgs)
MsgBox("ThreadException caught")
End Sub
Protected Overrides Sub Login()
Throw New Exception("Ha!")
MyBase.Login()
End Sub
Protected Overrides Sub Form2_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs)
MsgBox("Form1Closing")
MyBase.Form2_FormClosing(sender, e)
End Sub
End Class
Форма 2:
Public Class Form2
Protected Overridable Sub Form2_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
MsgBox("Form2Closing")
End Sub
Private Sub Form2_Shown(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown
Login()
End Sub
Protected Overridable Sub Login()
MsgBox("Form2 LoggingIn")
End Sub
End Class