boost :: python导出自定义异常并继承Python的异常

时间:2012-07-12 09:23:34

标签: c++ exception boost-python

boost::python Export Custom Exception的已接受答案显示了如何从C ++导出自定义异常类,Boost.Python custom exception class显示了如何导出继承自Python异常的异常类。我怎么能两个都做?这是一个异常类,它具有自定义方法来检索信息,并且该类也是从Python的异常派生的。

1 个答案:

答案 0 :(得分:3)

Jim Bosch在C++-sig list上建议的一个可行的解决方案是使用组合而不是从包装的C ++异常继承。代码必须像完成here一样创建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:
    ...