首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost.Python自定义异常类

问Boost.Python自定义异常类
EN

Stack Overflow用户
提问于 2012-03-08 23:34:38
回答 2查看 3.3K关注 0票数 15

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-14 03:08:05

下面的函数创建一个新的Python异常类并将其添加到当前作用域中。如果在模块初始化函数中调用它,则会将其添加到模块中。

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

代码语言:javascript
复制
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;
}

如下所示使用函数:

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

代码语言:javascript
复制
PyObject* myExceptionTypeObj = 0;

BOOST_PYTHON_MODULE(MyModule)
{
    ...
    myExceptionTypeObj = createExceptionClass("MyException");
    ...
}

引发MyModule.MyException类型的异常

代码语言:javascript
复制
PyErr_SetString(myExceptionTypeObj, "Oh my!")
票数 19
EN

Stack Overflow用户

发布于 2015-04-24 17:15:48

@Kenny:

如果您参考

代码语言:javascript
复制
PyErr_SetString(myExceptionTypeObj, "Oh my!")

我不认为这是“将字符串复制到全局对象”。相反,它设置Python的内部错误指示符,以便解释器在下一次检查错误指示符时引发myExceptionTypeObj的实例。

Python的异常处理与(每个Python线程)全局错误指示器一起工作,这是通过C API afaict引发异常的常用方法。

我对此的看法是,如果你现在持有GIL,你是安全的,并且会在输入C代码的Python线程中适当地导致异常。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9620268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档