Как описаноздесь, важно убедиться, что исключения, выброшенные кодом C++, не переходят в ядро интерпретатора Python. По умолчанию, Boost. Python переводит все исключения C++, выброшенные завернутыми функциями и функциями ввода модулей в Python, но переводчики по умолчанию чрезвычайно ограничены: большинство исключений C++ появятся в Python как исключениеRuntimeError, представление которого является «Исключением C++, которое невозможно идентифицировать». Чтобы создавать лучшие сообщения об ошибках, пользователи могут зарегистрировать дополнительные переводчики исключений, как описано ниже.
Перевод является CopyConstructible, и следующий код должен быть хорошо сформирован:
voidf(ExceptionTypex){translate(x);}
. Выражение<translate(x)>должно либо отбросить исключение C++, либо последующий призыв к<PyErr_Occurred()>должен вернуться 1.
Effects
Добавляет копию перевода в последовательность исключений переводчиков, опробованных при бусте. Python улавливает исключение, которое скоро перейдет в основной интерпретатор Python. Новый переводчик получит «первый шанс» на перевод всех исключений, соответствующих вышеприведенному пункту улова. Любому впоследствии зарегистрированному переводчику будет разрешено перевести это исключение раньше. Переводчик, который не может перевести данное исключение C++, может перебросить его, и он будет обрабатываться переводчиком, который был зарегистрирован ранее (или переводчиком по умолчанию).
#include<boost/python/module.hpp>#include<boost/python/def.hpp>#include<boost/python/exception_translator.hpp>#include<exception>structmy_exception:std::exception{charconst*what()throw(){return"One of my exceptions";}};voidtranslate(my_exceptionconst&e){// Use the Python 'C' API to set up an exception objectPyErr_SetString(PyExc_RuntimeError,e.what());}voidsomething_which_throws(){...throwmy_exception();...}BOOST_PYTHON_MODULE(exception_translator_ext){usingnamespaceboost::python;register_exception_translator<my_exception>(&translate);def("something_which_throws",something_which_throws);}
Статья boost/python/exception_translator.hpp раздела Boost.Python Reference Manual Chapter 2. High Level Components может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.