SWIG: 从C++代码报告Python异常
我在使用一个库,这个库的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);
}
}