捕获.Net 2.0中未处理的异常。错误的事件被称为

时间:2010-04-12 10:21:28

标签: .net exception exception-handling unhandled-exception

我正在研究如何在.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 documentation之后看起来像在“Windows窗体线程”内发生异常时引发Application.ThreadException(无论它们是什么,恕我直言,每个应用程序中只有一个Windows窗体线程)。因此,Application.ThreadException与从创建应用程序Form的线程抛出的异常相关,其他异常由AppDomain.CurrentDomain.UnhandledException处理。

1 个答案:

答案 0 :(得分:2)

是的,这很正常。在调试器下运行时,Application.ThreadException捕获器被禁用。这样做可以轻松诊断异常。要使其行为相同,您必须调用Application.SetUnhandledExceptionMode() method。不幸的是,在VB.NET项目中很难做到,你必须禁用应用程序框架。

不值得麻烦,如果要测试异常处理代码,请按Ctrl + F5。