Boost.Python自定义异常类

Joh*_*åde 14 c++ python exception boost-python

我正在使用Boost.Python实现一个Python扩展模块.该模块应该定义自己继承的自定义异常类Exception.我怎么做?

Joh*_*åde 16

以下函数创建一个新的Python异常类,并将其添加到当前范围.如果在模块初始化函数中调用它,则将其添加到模块中.

第一个参数是新异常类的名称.第二个参数是新异常类的基类的类型对象; 它默认为类型对象Exception.返回值是新异常类的类型对象.

PyObject* createExceptionClass(const char* name, PyObject* baseTypeObj = PyExc_Exception)
{
    using std::string;
    namespace bp = boost::python;

    string scopeName = bp::extract<string>(bp::scope().attr("__name__"));
    string qualifiedName0 = scopeName + "." + name;
    char* qualifiedName1 = const_cast<char*>(qualifiedName0.c_str());

    PyObject* typeObj = PyErr_NewException(qualifiedName1, baseTypeObj, 0);
    if(!typeObj) bp::throw_error_already_set();
    bp::scope().attr(name) = bp::handle<>(bp::borrowed(typeObj));
    return typeObj;
}
Run Code Online (Sandbox Code Playgroud)

使用如下功能:

在模块初始化函数中调用函数并将返回值存储在全局变量中:

PyObject* myExceptionTypeObj = 0;

BOOST_PYTHON_MODULE(MyModule)
{
    ...
    myExceptionTypeObj = createExceptionClass("MyException");
    ...
}
Run Code Online (Sandbox Code Playgroud)

提出类型的异常MyModule.MyException:

PyErr_SetString(myExceptionTypeObj, "Oh my!")
Run Code Online (Sandbox Code Playgroud)

  • 说`MyException`真的映射到C++类型.我将如何揭露其成员? (4认同)