SWIG: 从C++代码报告Python异常

6 投票
2 回答
1978 浏览
提问于 2025-04-16 10:41

我在使用一个库,这个库的API文档里说明要定义一个从库里的某个特定类继承的类。这个库是用C++写的,而Python的接口是通过SWIG生成的。问题是,当我运行我的Python代码时,无论Python抛出什么异常,我都会收到一个错误,内容是“terminate called after throwing an instance of 'Swig::DirectorMethodException'”。

我希望在执行我的程序时,能够看到Python代码抛出的这个异常,特别是像ZeroDivisionError这样的情况。

我尝试按照SWIG文档中描述的方法进行一些修改,文档链接是http://www.swig.org/Doc2.0/Python.html#Python_nn36,但没有成功。无论我在module.i文件里写什么,我还是会收到同样的消息“terminate called after throwing an instance of 'Swig::DirectorMethodException'”。

有没有人能给我一些建议,告诉我该如何处理这个问题,以便Python的异常能够正常报告出来?

2 个回答

1

我不知道你在代码方面进展到什么程度,所以这可能对你帮助不大,但我用boost::python的效果比SWIG要好。你可以试试这个方法:boost::python 导出自定义异常

4

在程序的控制台中报告Python抛出的异常。

这是Madhusudan.C.S.提供的一个有用的解决方案。可以查看他对ginbot回答的评论。我把它放在这里作为一个回答,这样大家更容易看到。

/* MyInterface.i */
%module(directors="1") MyInterface
%feature("director:except") {
    if( $error != NULL ) {
        PyObject *ptype, *pvalue, *ptraceback;
        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
        PyErr_Restore( ptype, pvalue, ptraceback );
        PyErr_Print();
        Py_Exit(1);
    }
} 

撰写回答