gpt4 book ai didi

c# - Application.ThreadException 与 AppDomain.UnhandledException

转载 作者:可可西里 更新时间:2023-11-01 08:15:46 30 4
gpt4 key购买 nike

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

现在提出问题:到目前为止,此应用程序具有 Application.ThreadException 的处理程序,但它仍然因未处理的异常而崩溃。我也在考虑为 AppDomain.UnhandledException 添加一个处理程序,尽管我不确定它是否有帮助。在这种情况下,是否存在任何未被 Application.ThreadException 捕获的未处理异常?

最佳答案

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

它的作用不是陷阱是在任何非 UI 线程上引发的异常,例如使用 Thread.Start()、ThreadPool.QueueUserWorkItem 或委托(delegate)的 BeginInvoke() 方法启动的工作线程。其中任何未处理的异常都将终止应用程序,AppDomain.UnhandledException 是最后的喘息。

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

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

关于c# - Application.ThreadException 与 AppDomain.UnhandledException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6114976/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com