1 // (C) Copyright David Abrahams 2000. 2 // Distributed under the Boost Software License, Version 1.0. (See 3 // accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 // 6 // The author gratefully acknowleges the support of Dragon Systems, Inc., in 7 // producing this work. 8 9 #ifndef ERRORS_DWA052500_H_ 10 # define ERRORS_DWA052500_H_ 11 12 # include <boost/python/detail/prefix.hpp> 13 # include <boost/function/function0.hpp> 14 15 namespace boost { namespace python { 16 17 struct BOOST_PYTHON_DECL error_already_set 18 { 19 virtual ~error_already_set(); 20 }; 21 22 // Handles exceptions caught just before returning to Python code. 23 // Returns true iff an exception was caught. 24 BOOST_PYTHON_DECL bool handle_exception_impl(function0<void>); 25 26 template <class T> handle_exception(T f)27bool handle_exception(T f) 28 { 29 return handle_exception_impl(function0<void>(boost::ref(f))); 30 } 31 rethrow()32namespace detail { inline void rethrow() { throw; } } 33 handle_exception()34inline void handle_exception() 35 { 36 handle_exception(detail::rethrow); 37 } 38 39 BOOST_PYTHON_DECL void throw_error_already_set(); 40 41 template <class T> expect_non_null(T * x)42inline T* expect_non_null(T* x) 43 { 44 if (x == 0) 45 throw_error_already_set(); 46 return x; 47 } 48 49 // Return source if it is an instance of pytype; throw an appropriate 50 // exception otherwise. 51 BOOST_PYTHON_DECL PyObject* pytype_check(PyTypeObject* pytype, PyObject* source); 52 53 }} // namespace boost::python 54 55 #endif // ERRORS_DWA052500_H_ 56