我有一个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} })。
答案 0 :(得分:2)
答案 1 :(得分:1)
我终于弄明白了问题是什么,在这种特殊情况下,它与在DLL之间抛出异常无关。
由于在调用堆栈中进一步安装了异常处理程序挂钩,因此出现问题。我通过向库中的每个级别添加try,catch(...)块来诊断这一点,直到找到未传播异常的点。当我注释掉异常处理程序钩子注册代码时,异常成功传播。
我现在必须弄清楚异常处理程序挂钩的工作方式,这超出了本问题的范围。感谢所有分享他们答案的人。