【发布时间】:2009-09-22 08:22:43
【问题描述】:
情况是我有一个用 C++ 编写的动态库,它由另一个动态库为 Python 包装,也是用 C++ 编写的(具体由 SIP 生成)。第一个动态库定义了一个函数do_raise,它抛出了一个异常RaiserError,它是std::exception的一个子类。第二个动态库在包装do_raise 时尝试捕获RaiserError 以便将其转换为Python 异常。
使用 Visual C++ 构建,一切正常,RaiserError 被正确捕获。然而,在 Linux 上使用 g++,RaiserError 不会被捕获。如果我尝试捕获std::exception(RaiserError 的基类),它会起作用。这里出了什么问题?这两个库是否有不同的 RaiserError 类型概念,因为它没有被 catch 块识别?
为了进行测试,我还在 C++ 库中编写了一个调用 do_raise 的小型可执行文件,在这里,即使使用 g++,我也能够捕获 RaiserError。
【问题讨论】:
-
提供您的编译器版本可能很有用。
-
真实应用程序和您的测试应用程序之间必须存在差异。其中至少有一个是关键的。从您写的内容来看,我们很难说非常。
-
我使用一个版本的 g++,即 Ubuntu 9.04 附带的版本,即 4.3.3。与测试应用的不同之处在于它也是用 C++ 编写的,而不是 Python。自从我更改了 Python 包装器库的构建参数(与符号导出有关)以来,我已经能够使一个小型 Python 程序工作。但是,我的实际应用程序仍然无法运行,因此这表明问题归结为不兼容的构建参数。
标签: c++ exception exception-handling g++