Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

boost/python/errors.hpp

Boost , Boost.Python Reference Manual , Chapter 2. High Level Components

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

предоставляет типы и функции для управления и перевода между исключениями Python и C++. Это относительно низкоуровневая функциональность, которая в основном используется Boost. Пользователям это редко нужно.

error_already_set - это тип исключения, который может быть брошен, чтобы указать, что произошла ошибка Python. При бросании предварительное условие заключается в том, что PyErr_Occurred() возвращает значение, конвертируемое в true. Портативный код не должен выбрасывать этот тип исключений напрямую, а должен вместо этого использовать throw_error_already_set(), ниже.

namespace boost { namespace python
{
    class error_already_set {};
}}
template <class T> bool handle_exception(T f) throw();
void handle_exception() throw();

Requires

Первая форма требует, чтобы функция выражения 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 <class T> T* expect_non_null(T* x);

Returns

х

Throws

error_already_set() iff x == 0.

Rationale

Упрощает обработку ошибок при вызове функций в API Python / C, которые возвращают 0 при ошибке.

void throw_error_already_set();

Effects

скачать error_already_set();

Rationale

Упрощает обработку ошибок при вызове функций в API Python / C, которые возвращают 0 при ошибке.

void throw_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::string get_name(boost::python::object obj)
{
   // throws if there's no __name__ attribute
   PyObject* p = boost::python::expect_non_null(
      PyObject_GetAttrString(obj.ptr(), "__name__"));
   char const* s = PyString_AsString(p);
   if (s != 0)
        Py_DECREF(p);
   // throws if it's not a Python string
   std::string result(
      boost::python::expect_non_null(
         PyString_AsString(p)));
   Py_DECREF(p); // Done with p
   return result;
}
//
// 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.
void same_name_impl(PyObject*& result, boost::python::object a, boost::python::object b)
{
   result = PyInt_FromLong(
      get_name(a) == get_name(a2));
}
object borrowed_object(PyObject* p)
{
   return boost::python::object(
        boost::python::handle<>(
             boost::python::borrowed(a1)));
}
// This is an example Python 'C' API interface function
extern "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))
      return 0;
   // 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()
      return 0;
   }
   return result;
}
//
// 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))
      return 0;
   try {
      return PyInt_FromLong(
         get_name(borrowed_object(a1)) == get_name(borrowed_object(a2)));
   }
   catch(...)
   {
      // If an exception was thrown, translate it to Python
      boost::python::handle_exception();
      return 0;
   }
}

PrevUpHomeNext

Статья boost/python/errors.hpp раздела Boost.Python Reference Manual Chapter 2. High Level Components может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 2. High Level Components ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 06:44:00/0.004439115524292/0