我试图以这种方式设置我的.net应用程序,总是会在某处记录未处理的异常。我的理解是需要为此设置两个处理程序,Windows.Forms.Application.ThreadException
用于UI线程(后跟Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
),AppDomain.CurrentDomain.UnhandledException
用于非UI线程。我在我的应用程序Sub Main()
中执行此操作,并且Application.ThreadException
- 处理程序实际上正在运行,但我无法弄清楚,如何获取AppDomain.CurrentDomain.UnhandledException
- 处理程序工作(或为什么它不起作用)。
我的测试代码是这样的:
Private Sub ThreadTask(ByVal StateObj As Object)
Throw New Exception("Unhandled Exception")
End Sub
Public Sub CauseException()
Dim StObj As New ThreadParamsObj
ThreadPool.QueueUserWorkItem(AddressOf ThreadTask, StObj)
End Sub
如果我在简约测试应用程序(带有单个按钮的表单,AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionHandler
中调用Form1_Load
)中尝试它 - 它按预期工作,显示MsgBox
但是在"真实"申请它没有用。
什么可以阻止事件被触发或处理程序处理它?</ p>
答案是: .net 3.5 中的System.Data.OracleClient.OracleConnection.Open
和Oracle.DataAccess.Client.Open
(以及其他DbConnections),升级到 .net 4.6.1 解决了这个问题。