【发布时间】:2009-09-03 14:21:29
【问题描述】:
我有一个有时会引发异常的第三方库。所以我决定将我的代码包装在 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(...)
}
所以我有两个问题:
第三方编译库的方式是否发生了一些变化,以至于我的代码无法捕获异常? (是的,如果我知道要告诉他们什么,我可以让第三方进行任何必要的修复并为我重新编译。)
假设我无法让第三方修复它,我能做些什么来捕获这些异常?我在想……有什么方法可以让我确定 pObject 是否被释放?
【问题讨论】:
标签: c++ exception exception-handling