3

boost::python Export Custom Exception的公认答案显示了如何从 C++ 中导出自定义异常类,而Boost.Python 自定义异常类显示了如何导出继承自 Python 异常的异常类。我怎样才能做到这两点?那就是公开一个异常类,该类具有检索信息的自定义方法,并且该类还可以从 Python 的异常中派生。

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());
}

然后可以像这样从 Python 访问包装的 C++ 异常:

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

但异常也会被

try:
    ...
except Exception:
    ...
于 2012-08-02T04:04:00.247 回答