предоставляет типы и функции для управления и перевода между исключениями Python и C++. Это относительно низкоуровневая функциональность, которая в основном используется Boost. Пользователям это редко нужно.
error_already_set - это тип исключения, который может быть брошен, чтобы указать, что произошла ошибка Python. При бросании предварительное условие заключается в том, что PyErr_Occurred() возвращает значение, конвертируемое в true. Портативный код не должен выбрасывать этот тип исключений напрямую, а должен вместо этого использовать throw_error_already_set(), ниже.
Первая форма требует, чтобы функция выражения 0(f) была действительной. Вторая форма требует, чтобы в настоящее время обрабатывалось исключение C++ (см. раздел 15.1 стандарта C++).
Effects
Первая форма вызывает f() внутри блока проб, который сначала пытается использовать все зарегистрированные переводчики исключений . Если ни один из них не переводит исключение, то в пунктах улова устанавливается соответствующее исключение Python для пойманного исключения C++, возвращая истинное, если исключение было брошено, ложное в противном случае. Вторая форма передает функцию, которая возвращает рассматриваемое в настоящее время исключение к первой форме.
Postconditions
Исключением не занимаются
Throws
ничего
Rationale
На межъязыковых границах важно обеспечить отсутствие исключений C++, так как на языке вызова обычно нет оборудования, необходимого для правильного раскручивания стека. Используйте handle_ Exception для управления переводом исключений всякий раз, когда ваш код C++ вызывается непосредственно из API Python. Это делается для вас автоматически с помощью обычных средств обертывания функций: make_function(), make_constructor(), def() и class_::def(). Вторая форма может быть более удобной в использовании (см. пример ниже), но различные компиляторы имеют проблемы, когда исключения перебрасываются из входящего пробного блока.
template<classT>T*expect_non_null(T*x);
Returns
х
Throws
error_already_set() iff x == 0.
Rationale
Упрощает обработку ошибок при вызове функций в API Python / C, которые возвращают 0 при ошибке.
voidthrow_error_already_set();
Effects
скачать error_already_set();
Rationale
Упрощает обработку ошибок при вызове функций в API Python / C, которые возвращают 0 при ошибке.
voidthrow_error_already_set();
Effects
скачать error_already_set();
Rationale
Многие платформы и компиляторы не могут последовательно улавливать исключения, выброшенные за пределы общей библиотеки. Используя эту функцию от Boost. Библиотека Python гарантирует, что соответствующий блок улова в файле handle_ Exception() может уловить исключение.
#include<string>#include<boost/python/errors.hpp>#include<boost/python/object.hpp>#include<boost/python/handle.hpp>// Returns a std::string which has the same value as obj's "__name__"// attribute.std::stringget_name(boost::python::objectobj){// throws if there's no __name__ attributePyObject*p=boost::python::expect_non_null(PyObject_GetAttrString(obj.ptr(),"__name__"));charconst*s=PyString_AsString(p);if(s!=0)Py_DECREF(p);// throws if it's not a Python stringstd::stringresult(boost::python::expect_non_null(PyString_AsString(p)));Py_DECREF(p);// Done with preturnresult;}//// Demonstrate form 1 of handle_exception//// Place into result a Python Int object whose value is 1 if a and b have// identical "__name__" attributes, 0 otherwise.voidsame_name_impl(PyObject*&result,boost::python::objecta,boost::python::objectb){result=PyInt_FromLong(get_name(a)==get_name(a2));}objectborrowed_object(PyObject*p){returnboost::python::object(boost::python::handle<>(boost::python::borrowed(a1)));}// This is an example Python 'C' API interface functionextern"C"PyObject*same_name(PyObject*args,PyObject*keywords){PyObject*a1;PyObject*a2;PyObject*result=0;if(!PyArg_ParseTuple(args,const_cast<char*>("OO"),&a1,&a2))return0;// Use boost::bind to make an object compatible with// boost::Function0<void>if(boost::python::handle_exception(boost::bind<void>(same_name_impl,boost::ref(result),borrowed_object(a1),borrowed_object(a2)))){// an exception was thrown; the Python error was set by// handle_exception()return0;}returnresult;}//// Demonstrate form 2 of handle_exception. Not well-supported by all// compilers.//extern"C"PyObject*same_name2(PyObject*args,PyObject*keywords){PyObject*a1;PyObject*a2;PyObject*result=0;if(!PyArg_ParseTuple(args,const_cast<char*>("OO"),&a1,&a2))return0;try{returnPyInt_FromLong(get_name(borrowed_object(a1))==get_name(borrowed_object(a2)));}catch(...){// If an exception was thrown, translate it to Pythonboost::python::handle_exception();return0;}}
Статья boost/python/errors.hpp раздела Boost.Python Reference Manual Chapter 2. High Level Components может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.