【问题标题】:boost::python export custom exception and inherit from Python's Exceptionboost::python 导出自定义异常并继承自 Python 的 Exception
【发布时间】:2012-07-12 09:23:34
【问题描述】:

boost::python Export Custom Exception 接受的答案展示了如何从 C++ 导出自定义异常类,Boost.Python custom exception class 展示了如何导出继承自 Python 异常的异常类。我怎样才能做到这两点?即公开一个异常类,该类具有检索信息的自定义方法,并且该类还派生自 Python 的异常。

【问题讨论】:

    标签: c++ exception boost-python


    【解决方案1】:

    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:
        ...
    

    【讨论】:

    • 请注意,exc_t.attr("cause") = exc; 将 C++ 异常实例作为属性添加到 Python 异常 class。因此,如果您在 Python 中捕获了异常实例 e1 并保留对它的引用,那么第二次引发此类 C++ 异常将更改 e1 的原因属性以引用新的 C++ 异常实例。
    猜你喜欢
    • 2011-01-16
    • 2011-02-03
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多