3

boost::python Export Custom Exceptionに対する受け入れられた回答は、C++ からカスタム例外クラスをエクスポートする方法を示し、Boost.Python カスタム例外クラスは、Python の例外から継承する例外クラスをエクスポートする方法を示します。どうすれば両方を行うことができますか? これは、情報を取得するためのカスタム メソッドを持つ例外クラスを公開し、そのクラスを Python の Exception から派生させることです。

4

1 に答える 1

5

Jim Bosch がC++-sig listで提案した実行可能な解決策は、ラップされた C++ 例外から継承する代わりに合成を使用することです。このコードでは、ここで行うように Python 例外を作成し、ラップされた C++ 例外を Python 例外のインスタンス変数として追加する必要があります。

void translator(const MyCPPException &x) {
    bp::object exc(x); // wrap the C++ exception

    bp::object exc_t(bp::handle<>(bp::borrowed(exceptionType)));
    exc_t.attr("cause") = exc; // add the wrapped exception to the Python exception

    PyErr_SetString(exceptionType, x.what());
}

ラップされた C++ 例外は、次のように Python からアクセスできます。

try:
    ...
except MyModule.MyCPPExceptionType as e:
    cause = e.cause # wrapped exception can be accessed here

しかし、例外もキャッチされます

try:
    ...
except Exception:
    ...
于 2012-08-02T04:04:00.247 に答える