Следующая функция создает новый класс исключений 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;
}
Используйте функцию следующим образом:
Вызвать функцию в функции инициализации модуля и сохранить возвращаемое значение в глобальной переменной:
PyObject* myExceptionTypeObj = 0;
BOOST_PYTHON_MODULE(MyModule)
{
...
myExceptionTypeObj = createExceptionClass("MyException");
...
}
Повышение исключения типа MyModule.MyException
:
PyErr_SetString(myExceptionTypeObj, "Oh my!")