Чтобы разоблачить исключение С++ для Python таким образом, что это действительно работает, вам нужно написать что-то вроде:
std::string scope = py::extract<std::string>(py::scope().attr("__name__"));
std::string full_name = scope + "." + name;
PyObject* exc_type = PyErr_NewException(&full_name[0], PyExc_RuntimeError, 0);
// ...
Но это не похоже на что-то другое в Boost.Python. Если я хочу выставить:
struct Error { int code; };
Я мог бы написать:
py::class_<Error>("Error", py::no_init)
.def_readonly("code", &Error::code)
;
Как я могу объединить привязку класса для Error
с созданием исключения на PyErr_NewException
? В принципе, я хочу throw Error{42}
и явным образом работаю с Python: я могу поймать Error
или RuntimeError
и иметь эту работу, и я могу поймать AssertionError
(или подобное) и иметь это ни ловите Error
, ни бросайте SystemError
.