errors.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 106 行

CPP
106
字号
// Copyright David Abrahams 2001.// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)#ifndef BOOST_PYTHON_SOURCE# define BOOST_PYTHON_SOURCE#endif#include <boost/python/errors.hpp>#include <boost/cast.hpp>#include <boost/python/detail/exception_handler.hpp>namespace boost { namespace python {error_already_set::~error_already_set() {}// IMPORTANT: this function may only be called from within a catch block!BOOST_PYTHON_DECL bool handle_exception_impl(function0<void> f){    try    {        if (detail::exception_handler::chain)            return detail::exception_handler::chain->handle(f);        f();        return false;    }    catch(const boost::python::error_already_set&)    {        // The python error reporting has already been handled.    }    catch(const std::bad_alloc&)    {        PyErr_NoMemory();    }    catch(const bad_numeric_cast& x)    {        PyErr_SetString(PyExc_OverflowError, x.what());    }    catch(const std::out_of_range& x)    {        PyErr_SetString(PyExc_IndexError, x.what());    }    catch(const std::invalid_argument& x)    {        PyErr_SetString(PyExc_ValueError, x.what());    }    catch(const std::exception& x)    {        PyErr_SetString(PyExc_RuntimeError, x.what());    }    catch(...)    {        PyErr_SetString(PyExc_RuntimeError, "unidentifiable C++ exception");    }    return true;}void BOOST_PYTHON_DECL throw_error_already_set(){    throw error_already_set();}namespace detail {bool exception_handler::operator()(function0<void> const& f) const{    if (m_next)    {        return m_next->handle(f);    }    else    {        f();        return false;    }}exception_handler::exception_handler(handler_function const& impl)    : m_impl(impl)    , m_next(0){    if (chain != 0)        tail->m_next = this;    else        chain = this;    tail = this;}exception_handler* exception_handler::chain;exception_handler* exception_handler::tail;BOOST_PYTHON_DECL void register_exception_handler(handler_function const& f){    // the constructor links the new object into a handler chain, so    // this object isn't actaully leaked (until, of course, the    // interpreter exits).    new exception_handler(f);}} // namespace boost::python::detail}} // namespace boost::python

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?