难以捉摸的例外情况?

时间:2011-02-19 03:08:00

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

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

我见过一个2005微软kb article,它讨论了在一个DLL中抛出的异常,这些异常无法在另一个DLL中捕获。几年前,似乎这是通过修补程序解决的,但我现在可能遇到了这个问题 - 使用Visual C ++ 2008。

具体来说,基于崩溃后的minidump文件报告,在调用:: fgetpos时我看到了这个:

kernel32!UnhandledExceptionFilter+0x55b

我头脑中有两件事。首先我注意到指定的catch块,位于与调用DLL不同的DLL中,没有捕获异常!这是知识库文章描述的内容的再现吗?其次,我想知道一个kernel32“未处理的异常”是否是Visual C ++ catch块无法捕获的东西。我认为使用“全能”的省略就足够了。

我有什么遗失的吗?

3 个答案:

答案 0 :(得分:10)

visual C ++ catch块只能捕获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扩展。

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

捕获异常时,您交换堆和堆栈,这需要更多的内存,而当内存用完时您将无法执行此操作。同样,无法捕获框架异常并继续执行。您只能注册用于处理(记录)异常的侦听器,并且通常您具有框架设置,可以确定框架在杀死应用程序之前将其保持活动状态的秒数(以允许您对其进行记录)

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