//// Copyright 2019 Peter Dimov Distributed under the Boost Software License, Version 1.0. http://www.boost.org/LICENSE_1_0.txt //// [#reference] # Reference :toc: :toc-title: :idprefix: [#synopsis] ## Synopsis ``` #include #include #include namespace boost { #if defined( BOOST_NO_EXCEPTIONS ) BOOST_NORETURN void throw_exception( std::exception const & e ); // user defined BOOST_NORETURN void throw_exception( std::exception const & e, boost::source_location const & loc ); // user defined #else template BOOST_NORETURN void throw_exception( E const & e ); template BOOST_NORETURN void throw_exception( E const & e, boost::source_location const & loc ); #endif } // namespace boost #define BOOST_THROW_EXCEPTION(x) \ ::boost::throw_exception(x, BOOST_CURRENT_LOCATION) namespace boost { template BOOST_NORETURN void throw_with_location( E && e, boost::source_location const & loc = BOOST_CURRENT_LOCATION ); template boost::source_location get_throw_location( E const & e ); } // namespace boost ``` ## throw_exception ``` #if defined( BOOST_NO_EXCEPTIONS ) BOOST_NORETURN void throw_exception( std::exception const & e ); // user defined #else template BOOST_NORETURN void throw_exception( E const & e ); #endif ``` Requires: :: `E` must have `std::exception` as a public and unambiguous base class. Effects: :: * When exceptions aren't available, the function is declared, but not defined. The user is expected to supply an appropriate definition. * Otherwise, if `BOOST_EXCEPTION_DISABLE` is defined, the function throws `e`. * Otherwise, the function throws an object of a type derived from `E`, derived from `boost::exception`, if `E` doesn't already derive from it, and containing the necessary support for `boost::exception_ptr`. ``` #if defined( BOOST_NO_EXCEPTIONS ) BOOST_NORETURN void throw_exception( std::exception const & e, boost::source_location const & loc ); // user defined #else template BOOST_NORETURN void throw_exception( E const & e, boost::source_location const & loc ); #endif ``` Requires: :: `E` must have `std::exception` as a public and unambiguous base class. Effects: :: * When exceptions aren't available, the function is declared, but not defined. The user is expected to supply an appropriate definition. * Otherwise, if `BOOST_EXCEPTION_DISABLE` is defined, the function throws `e`. * Otherwise, the function throws an object of a type derived from `E`, derived from `boost::exception`, if `E` doesn't already derive from it, and containing the necessary support for `boost::exception_ptr`. The `boost::exception` base class is initialized to contain the source location `loc`. ## throw_with_location ``` template BOOST_NORETURN void throw_with_location( E && e, boost::source_location const & loc = BOOST_CURRENT_LOCATION ); ``` Requires: :: `std::decay::type` must have `std::exception` as a public and unambiguous base class. Effects: :: * When exceptions aren't available, `boost::throw_exception( e, loc );` * Otherwise, the function throws an object of a type derived from `E`, such that, if this object `x` is caught as `std::exception` or `E`, `boost::get_throw_location( x )` would return `loc`. ## get_throw_location ``` template boost::source_location get_throw_location( E const & e ); ``` Requires: :: `E` must be polymorphic. Effects: :: * If `e` is a subobject of the object thrown by `boost::throw_with_location( x, loc )`, returns `loc`. * If `dynamic_cast( e )` returns a nonzero value, returns the source location stored in that `boost::exception` subobject, if any. * Otherwise, returns a default constructed source location.