Python:引用在扩展模块中使用PyErr_NewException创建的异常类

时间:2013-11-11 21:45:28

标签: python swig

我正在创建自己的Python扩展(使用SWIG,但我希望这不相关)。

在C ++方面,我使用PyErr_NewException来创建自定义异常对象。

// C++ - create a custom Python Exception class.

m = Py_InitModule((char *) "MyModule", SwigMethods);
g_pyMyErr = PyErr_NewException( "MyModule.MyErr", 0, 0 );
Py_INCREF(g_pyMyErr);
int result = PyModule_AddObject(m, "MyErr", g_pyMyErr);

上面的代码返回成功值,我可以成功抛出上述异常,并在Python客户端代码中捕获它。

问题在于:当我在Python代码中引用“MyErr”时,我收到一条错误消息“MyErr”未定义。

// Python client code - catch the exception

from MyModule import *

try:
    causeException()
catch MyErr:  # Error: MyErr is not defined.
    pass
catch Exception:
    pass

编辑:我目前的想法是,SWIG可能正在改变(破坏)事物的名称。

1 个答案:

答案 0 :(得分:0)

您需要定义错误:

%{
  class MyErr {};
%}

另外,我建议添加这个,以便您可以捕获MyModule.MyErr的异常,而不是MyModule._MyModule.MyErr(因为这是SWIG生成它们的方式):

%pythoncode %{
  MyErr = _MyModule.MyErr
%}