我正在使用Boost.Python实现Python扩展模块。模块应该定义自己的自定义异常类,继承Exception
。我怎么做?Boost.Python自定义异常类
11
A
回答
12
以下函数创建一个新的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;
}
使用功能如下:
呼叫在模块初始化函数的功能和存储在一个全局变量返回值:MyModule.MyException
类型的
PyObject* myExceptionTypeObj = 0;
BOOST_PYTHON_MODULE(MyModule)
{
...
myExceptionTypeObj = createExceptionClass("MyException");
...
}
引发异常:
PyErr_SetString(myExceptionTypeObj, "Oh my!")
+4
说'MyException'确实映射到一个C++类型。我将如何揭露其成员? – Barry 2016-06-14 16:48:56
-1
@Kenny:
如果您参考
PyErr_SetString(myExceptionTypeObj, "Oh my!")
我不认为这是“复制字符串到全局对象”。相反,它会设置Python的内部错误指示器,以便解释器在其下一个错误指示器检查中引发myExceptionTypeObj的实例。
Python的异常处理与(每个Python线程)全局错误指示器一起工作,这是通过C API afaict引发异常的常用方法。
如果您在此刻持有GIL并且会在您的C代码输入的Python线程中正确地导致异常,那么您可以放心。
相关问题
- 1. Java自定义异常类
- 2. 定义自定义异常的基类
- 3. 调用自定义异常类
- 4. 处理自定义类中的异常
- 5. Java异常NullPointerException在自定义异常
- 6. 掷自定义异常
- 7. 使用自定义异常
- 8. PostgreSQL的自定义异常?
- 9. Sql Server自定义异常
- 10. ArrayIndexOutOfBoundsException的自定义异常
- 11. 自定义UITableViewCell异常
- 12. 自定义异常处理
- 13. 自定义游标异常?
- 14. 如何用Boost.Python定义Python元类?
- 15. boost :: python导出自定义异常并继承自Python异常
- 16. Java自定义异常:包约定?
- 17. 仅引发特定异常的自定义异常
- 18. 自定义类常量
- 19. 自定义异常类型是'自我记录' - 是不是?
- 20. 在类中嵌套自定义异常类? (蟒蛇)
- 21. django-social auth异常类型:AuthAlreadyAssociated如何重定向自定义
- 22. 如何抛出自定义异常时,异常的类型被构造
- 23. Boost.Python的:定义构造函数给定一个类的类
- 24. 使用自定义JsonConverter和自定义ContractResolver时StackOverflow异常
- 25. Laravel 5.1自定义异常的自定义参数
- 26. 哪个更好?许多自定义的异常类,或者是一个有许多自定义异常代码的异常类?
- 27. Python的自定义异常处理
- 28. 自定义GMapControl异常图块
- 29. 自定义NotFound异常--- Django REST框架
- 30. C++中的自定义异常
使你的错误继承自'Exception';标准错误由Python标准库中的工具生成的错误使用。 – Daenyth 2012-03-08 16:16:13
@Daenyth:你说得对。我修改了这个问题。 – user763305 2012-03-10 11:35:23