情况是我有一个用 C++ 编写的动态库,它由另一个动态库为 Python 包装,该动态库也是用 C++ 编写的(具体而言由 SIP 生成)。第一个动态库定义了一个函数do_raise
,它抛出一个异常RaiserError
,它是std::exception
的子类。第二个动态库在包装 do_raise
时 try catch RaiserError
以便将其转换为 Python 异常。
使用 Visual C++ 构建,一切都按预期工作,并且 RaiserError
被正确捕获。但是,在 Linux 上使用 g++ 时,不会捕获 RaiserError
。如果我 try catch std::exception
(RaiserError
的基类),它会起作用。这里出了什么问题?这两个库是否对 RaiserError
类型有不同的概念,因为它不会被 catch block 识别?
为了测试,我还编写了一个小的可执行文件,它调用 C++ 库中的 do_raise
,在这里我甚至可以使用 g++ 捕获 RaiserError
。
最佳答案
您无法跨模块边界可靠地传递 C++ 异常。在 Windows 上(至少对于 32 位进程)有一个标准的 ABI,但是对于 gcc,你就不走运了。
关于c++ - g++ 问题 : exception not caught,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1458765/