情况是,我有一个用C++编写的动态库,另一个动态库也用C++编写了动态库,该动态库也用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

最佳答案

您无法跨模块边界可靠地传递C++异常。在Windows上(至少对于32位进程),有一个标准的ABI,但是对于gcc,您很不走运。

10-06 00:54