我有一个第三方库有时会抛出异常。因此,我决定用try/catch(...)将我的代码包装起来,以便记录有关发生异常的信息(没有具体细节,只是发生了异常)。
但是由于某种原因,代码仍然崩溃。在客户端计算机上,它会严重崩溃,并且在catch(...)中记录异常的代码永远不会被执行。如果我在调试/开发机器上运行此代码,我会得到弹出窗口询问我是否要调试。当我这样做时,它会报告0xC0000005:访问位置XXX时违反访问权限。
奇怪的是,对于旧版本的第三方库,完全相同的代码确实会捕获异常,并记录异常的代码也会执行。(我在VS中观察相同条件的发生来验证了这一点。)
以下是正在执行的伪代码:
但是由于某种原因,代码仍然崩溃。在客户端计算机上,它会严重崩溃,并且在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 是否已被释放?