为什么不会在DLL中捕获此异常?

时间:2011-12-01 22:20:14

标签: c++ visual-c++

我有一个DLL会引发异常,如下所示:

throw POMException(err, drvErr, errmsg);

调用代码在一个单独的程序中,并且有一个try,catch块,如下所示:

try
{
    // function in separate DLL
}
catch (TXNPDO_Exception& e)
{
    SR_PERFLOG_MSG(SR_PERFMASK_SELECT, "ERROR selectInStages");
    TXNDBO_THROW(e);
}

在包含的文件中定义TXNPDO_Exception的位置:

#define TXNPDO_Exception POMException

在调试器中运行时,它指出POMException未处理。我甚至添加了一个catch(...)子句,但仍未处理。

我怀疑这与Visual C ++编译参数有关,因为所讨论的DLL库是一个遗留库,它是与调用它的程序分开编译的。我正在使用Visual Studio 2003。

使用以下(相关)标志编译DLL cpp文件:/X /GR /Ob1 /Zi /GX /Od /MDd /LD。调用程序中的其他异常处理正确。

有人能说明为什么没有将此异常传播到调用程序的原因吗?

修改

之前编译的DLL库中包含了我无法使用的可能的构建环境和代码更改。先前编译的库正确地传播异常。

我正在使用相同的编译器编译客户端程序,主要使用相同的开关:-Od -W3 -Z7 -MDd -GX -GR -Zm800(无/X/Ob1/Z7而非{{1} })。

2 个答案:

答案 0 :(得分:2)

我认为只有在针对相同的C ++运行时编译各种.dll和程序可执行文件时,才能跨越.dll边界抛出异常,从而共享同一个堆。我错了,但这是我最好的猜测。

编辑:

我想我不是wrong

答案 1 :(得分:1)

我终于弄明白了问题是什么,在这种特殊情况下,它与在DLL之间抛出异常无关。

由于在调用堆栈中进一步安装了异常处理程序挂钩,因此出现问题。我通过向库中的每个级别添加try,catch(...)块来诊断这一点,直到找到未传播异常的点。当我注释掉异常处理程序钩子注册代码时,异常成功传播。

我现在必须弄清楚异常处理程序挂钩的工作方式,这超出了本问题的范围。感谢所有分享他们答案的人。