我正在研究如何在.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处理。
答案 0 :(得分:2)
是的,这很正常。在调试器下运行时,Application.ThreadException捕获器被禁用。这样做可以轻松诊断异常。要使其行为相同,您必须调用Application.SetUnhandledExceptionMode() method。不幸的是,在VB.NET项目中很难做到,你必须禁用应用程序框架。
不值得麻烦,如果要测试异常处理代码,请按Ctrl + F5。