首先是一些背景知识:我有一个多线程 WinForms 应用程序,它正在与本机 dll 进行互操作。该应用程序有时会因未处理的异常而崩溃,我们正在尝试调查为什么会发生这种情况。为了方便起见,我正在创建一个全局异常处理程序,并计划从中生成进程转储文件。
现在回答问题:到目前为止,该应用程序有处理程序Application.ThreadException
但它仍然因未处理的异常而崩溃。我正在考虑添加一个处理程序AppDomain.UnhandledException
虽然我也不确定它是否有帮助。在这种情况下是否有任何可能的未处理的异常不会被捕获Application.ThreadException
?
是的,Application.ThreadException 只能捕获 UI 线程中引发的异常。在由于 Windows 通知而运行的代码中。或者用技术术语来说,是由消息循环触发的事件。大多数 Winforms 事件都属于此类。
它能做什么nottrap 是在任何非 UI 线程上引发的异常,例如使用 Thread.Start()、ThreadPool.QueueUserWorkItem 或委托的 BeginInvoke() 方法启动的工作线程。其中任何未处理的异常都将终止应用程序,AppDomain.UnhandledException 是最后的喘息。
再往下走,任何 CLR 机制都无法检测到由从未进行过任何托管 CLR 调用的本机代码在非托管线程中引发的硬件异常。 AccessViolation(异常代码 0xc0000005)是最常见的死亡原因。捕获这些异常的唯一方法是通过 Windows API SetUnhandledExceptionFilter()。这很难做到正确。
您可以使用 Application.SetUnhandledExceptionMode() 禁用 Application.ThreadException。这是明智之举,为用户提供“继续”选项没有多大意义。现在,托管线程中的所有异常行为都相同,请使用 AppDomain.UnhandledException 来记录它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)