无法使用catch(...)捕获c ++异常

Mic*_*ray 14 c++ exception-handling exception

我有一个第三方库,有时会抛出异常.所以我决定将我的代码包装在try/catch(...)中,以便我可以记录有关发生异常的信息(没有具体的细节,只是它发生了.)

但由于某种原因,代码仍然崩溃.在客户端计算机上,它很难崩溃,并且在catch(...)中记录异常的代码永远不会被执行.如果我在我的调试/开发机器上运行它,我会看到弹出窗口询问我是否要调试.当我这样做时,它报告0xC0000005:访问冲突读取位置XXX.

奇怪的是,对于旧版本的第三方库,完全相同的代码可以捕获异常,并且记录异常的代码可以执行.(我在VS中验证了这一点,看着出现同样的情况.)

这是正在执行的伪代码:

pObject = pSystem->Get_pObject()
pSystem->DoSomethingThatMightDestroy_pObject();
try
{
    /*   Call to third party function that is throwing exception */
    pObject->SetValue(0);
}
catch (...)
{
    __DEBUG_LOG_POSITION__;  // A macro to log the current file line
    //  This code used to run in the older version of third-party library
    //  but the newer version just crashes before running the catch(...)
}
Run Code Online (Sandbox Code Playgroud)

所以我有两个问题:

  1. 第三方编译库的方式是否有一些变化,以至于我的代码无法捕获异常?(是的,如果我知道要告诉他们什么,我有可能让第三方做出必要的修改并为我重新编译.)

  2. 假设我无法让第三方修复它,我该怎么做才能捕获这些异常?我正在考虑......是否有某种方法可以确定pObject是否已被释放?

Kla*_*aim 11

AFAIK访问冲突不会抛出异常...至少不是标准的!

也许捕获特定于Windows的"本机"异常会有所帮助:http://www.gamedev.net/reference/articles/article2488.asp

  • 用C++ try/catch捕获SEH异常通常是一个坏主意.有一个原因,MS默认在新的编译器中禁用它.通常,您应该使用SEH结构(如__try/__除外)而不是启用该编译器选项. (4认同)

Ste*_*ows 8

访问冲突不是C++异常.这是一个Windows结构化异常.如果你想在catch(...)中捕获它们,你将不得不使用_set_se_translator().

你可能应该谷歌因为所有原因捕获(...)是邪恶的,并确保你真的想这样做.