通过订阅 AppDomain.Current.Domain UnhandledException 事件,我的 .net 应用程序有一个全局异常处理程序。有几次我看到我的应用程序崩溃了,但这个全局异常处理程序永远不会被命中。不确定它是否有帮助,但应用程序正在执行一些 COM 互操作。
我的理解是,只要我没有任何本地 catch 块吞下异常,就应该始终命中这个全局异常处理程序。关于我可能遗漏了什么导致这个处理程序从未被调用的任何想法?
我们有一个.NET 3.5程序集(dll)由VB6"代理"(exe)通过COM接口执行.VB6代码确实调用:
' Ensure that no system dialog comes up when we GPF.
PreviousErrorMode = SetErrorMode(SEM_NOGPFAULTERRORBOX)
SetErrorMode PreviousErrorMode Or SEM_NOGPFAULTERRORBOX
' Assign our Exception Handler for this process.
PreviousExceptionFilter = SetUnhandledExceptionFilter(AddressOf UnhandledExceptionFilter)
Run Code Online (Sandbox Code Playgroud)
VB6 UnhandledExceptionFilter
将异常转换为VB6引发的错误.(但是这里也没有被调用,这个VB6代码多年来没有被改变 - 甚至没有被重新编译过.)
在由VB6代码创建的第一个.NET对象的构造函数中,我添加了一个处理程序AppDomain.CurrentDomain.UnhandledException
(并且,为了调试此问题,我添加了一个for Windows.Forms.Application.ThreadException
,但它没有帮助,不是我们有任何无论如何,由.NET显示的UI).
我确信UnhandledException
在VS2008中开发此代码时事件已经抓住了,但我不确定我是否已在VS2015中看到过它.
代码运行多个线程,其中一些执行主要目的,包括插入和更新SQL Server数据,以及通过TCP协议进行通信,TCP协议由其他线程处理,包括a BackgroundWorker
.
执行主要目的的人是:
taskThread = New Thread(AddressOf EnsureTaskCompletes)
taskThread.SetApartmentState(Threading.ApartmentState.STA)
taskThread.Start()
Run Code Online (Sandbox Code Playgroud)
向你展示更多的代码是太专有和复杂了,但我在调试这个问题的同时调整了代码,而Throw New Exception
不是最终具有相同效果的复杂代码.(*)
这个"简单"的异常没有被处理过,UnhandledExceptionHandler
并且只是默默地终止了程序,除了我打开了非托管调试.
AppDomain.CurrentDomain.UnhandledException
当.NET Framework"仅"作为dll加载时,是否存在记录的更改行为?
(因为COM重新注册的,我不想打造VS2008以前的版本尚未确认有是一个行为改变.我已经确认了.NET 3.5 的Exe由创建一个VS2015编译Thread
抛出未处理的异常并处理 …