123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- // 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 <boost/config.hpp>
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //[getting_started_class_traced
- #include <boost/stacktrace.hpp>
- #include <boost/exception/all.hpp>
- typedef boost::error_info<struct tag_stacktrace, boost::stacktrace::stacktrace> traced;
- //]
- //[getting_started_class_with_trace
- template <class E>
- 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 <stdexcept>
- 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/array.hpp>
- BOOST_NOINLINE void bar(int i) {
- boost::array<int, 5> 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 <iostream>
- 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<traced>(e);
- if (st) {
- std::cerr << *st << '\n'; /*<-*/ return 0; /*->*/
- } /*<-*/ return 3; /*->*/
- }
- //]
- return 5;
- }
|