情况是,我有一个用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,您很不走运。