FormClosing и необработанное исключение - PullRequest
2 голосов
/ 20 октября 2011

Я наследую свой класс от формы, в которой есть обработчик для 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

Если я выбрасываю исключение в моей форме вне попытки / улова, я замечаю два разных поведения:

  1. ЕслиЯ использую отладчик VS Я получаю необработанное исключение, и кажется, что мой обработчик необработанного исключения вызван.Кажется, что обработчик события formClosing не вызывается.
  2. Если я НЕ использую отладчик 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

1 Ответ

0 голосов
/ 05 января 2012

Я прошу прощения за то, что не использовал раздел комментариев, возможно, он должен быть там вместо (недостаточно повторений). Просто подумал, что я добавлю свое исследование 2c в:

  • Использование VS2010 SP1.
  • Создан проект WinApp с настройками по умолчанию.
  • Портировал приведенный выше код, добавив оператор "Inherits Form" в определение класса Form2.
  • С помощью debugger - получение сообщения «UnhandledException catch», а затем отладчик прерывается в строке «Throw New Exception» («Ha!»), Продолжение бросает меня в бесконечный цикл (получение сообщения «UnhandledException catch» снова и т.
  • Без отладчика - получено «UnhandledException catch», и после этого продолжается выполнение, при закрытии формы получается «Form1Closing» и «Form2Closing».

Кажется, все работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...