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来记录它们.
| 归档时间: |
|
| 查看次数: |
5903 次 |
| 最近记录: |