【问题标题】:Uncatchable Exceptions? [closed]无法捕获的异常? [关闭]
【发布时间】:2011-06-30 05:36:52
【问题描述】:

首先,C++中是否存在无法捕获的异常?

我见过一个 2005 microsoft kb article 讨论了在一个 DLL 中引发的异常,而这些异常不能在另一个 DLL 中捕获。几年前,这似乎已通过修补程序解决,但我现在可能遇到了这个问题 - 使用 Visual C++ 2008。

具体来说,根据崩溃后的小型转储文件报告,在调用 ::fgetpos 期间,我看到了这个:

kernel32!UnhandledExceptionFilter+0x55b

有两件事突然出现在我的脑海中。首先,我注意到位于与调用 DLL 不同的 DLL 中的指定 catch 块没有捕获异常!!!这是知识库文章描述的重复吗?其次,我想知道 kernel32“未处理的异常”是否是 Visual C++ catch 块无法捕获的东西。我认为使用“包罗万象”的省略号就足够了。

我有什么遗漏吗?

【问题讨论】:

  • 抛出的异常是什么?您还在使用 C++ 或 SEH 异常处理程序吗?如果没有异常处理程序处理异常,则 UnhandledExceptionFilter 处理,但异常可能已由代码处理。

标签: c++ exception exception-handling try-catch


【解决方案1】:

可视化 C++ 捕获块只能捕获 C++ 异常。 kernel32!UnhandlesExceptionFilter 是关于整个 SEH 异常范围的,它涵盖的范围远不止 C++ 异常。简单介绍一下,这篇文章还是新鲜准确的:A Crash Course on the Depths of Win32™ Structured Exception Handling

在我们讨论的过程中,您还需要覆盖/EHa 和可能的_set_se_translator。当然,还有晦涩难懂的__try/__exception SEH C++ MSVC 扩展。

【讨论】:

    【解决方案2】:

    您需要区分 C++ 异常和 SEH 异常。内核对 C++ 异常一无所知,而 C++ catch() 对 SEH 一无所知(除非启用了扩展的 catch 处理)。 SEH 异常由块 _try 和 _finally 捕获。这些是非常不同的,永远不要混淆它们。

    【讨论】:

      【解决方案3】:

      为了论证,假设您只有两种类型的异常。正常异常和框架异常。框架异常通常不能在 try/catch 中捕获。对于 c++ 来说,最常见的可能是内存不足异常(或者任何形式的用户未处理的正常异常都将作为框架异常进入框架进行处理)。

      当你捕获一个异常时,你交换了堆和栈,这需要更多的内存,当你用完内存时你不能这样做。也无法捕获框架异常并继续执行。您只能注册处理(记录)异常的侦听器,并且通常您有框架设置,用于确定框架在应用程序被杀死之前保持多少秒(以允许您记录它)

      因此,您可以捕获并继续处理正常的异常。框架异常总是会杀死您的应用程序,但您可以使用特殊的侦听器记录它们

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        • 2023-03-15
        • 2023-03-12
        相关资源
        最近更新 更多