// Copyright Antony Polukhin, 2016-2019. // // 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) #include //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //[getting_started_class_traced #include #include typedef boost::error_info traced; //] //[getting_started_class_with_trace template void throw_with_trace(const E& e) { throw boost::enable_error_info(e) << traced(boost::stacktrace::stacktrace()); } //] //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// BOOST_NOINLINE void oops(int i); BOOST_NOINLINE void foo(int i); BOOST_NOINLINE void bar(int i); #include BOOST_NOINLINE void oops(int i) { //[getting_started_throwing_with_trace if (i >= 4) throw_with_trace(std::out_of_range("'i' must be less than 4 in oops()")); if (i <= 0) throw_with_trace(std::logic_error("'i' must be greater than zero in oops()")); //] foo(i); std::exit(1); } #include BOOST_NOINLINE void bar(int i) { boost::array a = {{0, 0, 0, 0, 0}}; if (i < 5) { if (i >= 0) { foo(a[i]); } else { oops(i); } } std::exit(2); } BOOST_NOINLINE void foo(int i) { bar(--i); } #include int main() { //[getting_started_catching_trace try { foo(5); // testing assert handler } catch (const std::exception& e) { std::cerr << e.what() << '\n'; const boost::stacktrace::stacktrace* st = boost::get_error_info(e); if (st) { std::cerr << *st << '\n'; /*<-*/ return 0; /*->*/ } /*<-*/ return 3; /*->*/ } //] return 5; }