1

私は独自の 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 が名前を変更 (マングリング) している可能性があります。

4

1 に答える 1

0

次に、エラーを定義する必要があります。

%{
  class MyErr {};
%}

また、これを追加して、例外を MyModule._MyModule.MyErr としてではなく MyModule.MyErr としてキャッチできるようにすることをお勧めします (これが SWIG によって生成される方法であるため)。

%pythoncode %{
  MyErr = _MyModule.MyErr
%}
于 2015-08-19T17:20:20.553 に答える