Application.ThreadException与AppDomain.UnhandledException

Sil*_*ent 12 c# exception-handling crash-dumps winforms

首先是一些背景:我有一个多线程WinForms应用程序正在与本机dll互操作.这个应用程序有时会因未处理的异常而崩溃,我们正试图调查它为什么会发生.为了方便它,我正在创建一个全局异常处理程序,我计划从中生成进程转储文件.

现在提出疑问:截至目前,这个应用程序有处理程序,Application.ThreadException但它仍然与未处理的异常崩溃.我正在考虑添加一个处理程序,AppDomain.UnhandledException虽然我不确定它是否会有所帮助.在这种情况下是否存在任何可能未被处理的未处理异常Application.ThreadException

Han*_*ant 23

是的,Application.ThreadException只能捕获UI线程中引发的异常.在由于Windows通知而运行的代码中.或者在技术术语中,由消息循环触发的事件.大多数Winforms事件都适合此类别.

没有捕获的是在任何非UI线程上引发的异常,例如以Thread.Start(),ThreadPool.QueueUserWorkItem或委托的BeginInvoke()方法开始的工作线程.这些中的任何未处理的异常将终止应用程序,AppDomain.UnhandledException是最后一次喘息.

进一步下山,使用任何CLR机制都无法检测到从未进行任何托管CLR调用的本机代码在非托管线程中引发的硬件异常.AccessViolation(异常代码0xc0000005)是最常见的死因.捕获它们的唯一方法是通过Windows API,SetUnhandledExceptionFilter().这很难做对.

您可以使用Application.SetUnhandledExceptionMode()禁用Application.ThreadException.这是明智之举,为用户提供"继续"选项并没有多大意义.现在,托管线程中的所有异常行为都相同,请使用AppDomain.UnhandledException来记录它们.


dle*_*lev 8

Application.ThreadException将只上调对的WinForms UI线程的未处理异常(见这里)添加为处理程序AppDomain.UnhandledException可能会在这种情况下帮助(虽然有一些注意事项,如在备注栏说明这里.)