SWIG:将异常从 Python 抛出到 C++

Posted

技术标签:

【中文标题】SWIG:将异常从 Python 抛出到 C++【英文标题】:SWIG: Throwing exceptions from Python to C++ 【发布时间】:2010-05-21 19:01:00 【问题描述】:

我们有一个在 C++ 中定义的接口(抽象类,所有函数都是纯虚拟的),它将在 Python 中扩展。为了克服跨语言多态性问题,我们计划使用SWIG directors。我已经阅读了如何在 Python 代码 here、here、here 甚至在 SO 中捕获 C++ 代码引发的异常。

这相当简单,我预计在处理我们的库自身的异常时不会出现问题。我想知道但在文档中似乎找不到的是如何让我们的扩展 C++ 接口的 Python 实现以一种使 C++ 代码可见的方式抛出这些 C++ 异常。

我们可以在 *.i 文件中创建小函数,这样每个函数都会抛出我们的异常:

void throw_myException() throw MyException; 

但我想知道它将如何与 Python 代码交互。

任何人都有从 Python 代码中抛出 C++ 异常的经验吗?

【问题讨论】:

【参考方案1】:

(C)Python 是用 C 编写的。似乎“通过”解释器抛出异常可能很糟糕。

我的感觉是,从您的 API 返回某种可以通过工厂创建异常的令牌可能是最安全的。

这基本上就是我们在这里所做的,尽管我们使用 C# 而不是 Python 来生成“错误代码”数据,然后将其转换到 C++ 层,然后发送到异常工厂。

【讨论】:

我们在这里尝试了各种各样的东西,但最终决定使用这种方法。这是任何人建议的最清晰,最有效的方法。非常感谢。

以上是关于SWIG:将异常从 Python 抛出到 C++的主要内容,如果未能解决你的问题,请参考以下文章

SWIG C++ 到 Python:在抛出 ... 的实例后调用终止

通过 SWIG 处理 Java 中的 C++ 异常

如何将复数从 python numpy 传递给 c(目前正在尝试使用 SWIG)

如何从 MFP 8 Java 适配器向客户端抛出用户异常?

使用 SWIG 从 Python 向 C 传递和数组参数

Python:将数据从扭曲的套接字读取到 SWIG 结构中