FormClosing和Unhandled Exception

时间:2011-10-19 20:21:38

标签: .net vb.net winforms

我从一个具有FormClosing处理程序的表单继承我的类(它可以覆盖,所以我可以在调用base方法之前覆盖它并在那里执行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

如果我在try / catch之外的表单中抛出异常,我注意到两种不同的行为:

  1. 如果我使用VS调试器,我会得到一个未处理的异常,似乎我的未处理异常处理程序被调用。似乎没有调用formClosing事件处理程序。
  2. 如果我没有使用VS调试器,那么FormClosing处理程序正在使用 调用但未调用Unhandled Exception处理程序。
  3. 我很沮丧为什么#2中没有调用Unhandled Exception处理程序。理想情况下,我希望(在两种情况下)都要调用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 :(得分:0)

我很抱歉没有使用评论部分,也许它应该在那里(没有足够的代表)。我以为我会把我的2c研究投入:

  • 使用VS2010 SP1。
  • 使用默认设置创建WinApp项目。
  • 移植上面的代码,将“Inherits Form”语句添加到Form2类定义中。
  • 使用调试器 - 获取“UnhandledException caught”消息,然后调试器在Throw New Exception(“Ha!”)行中断,继续抛出无限循环(再次获取“UnhandledException caught”消息等)。
  • 没有调试器 - 获取“UnhandledException catch”,并在此之后继续执行,关闭表单时,获取“Form1Closing”和“Form2Closing”。

一切似乎都按预期工作。