throw_exception_test.cpp

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

CPP
149
字号
//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.//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 "helper2.hpp"#include <boost/exception/get_error_info.hpp>#include <boost/exception/info.hpp>#include <boost/exception_ptr.hpp>#include <boost/detail/lightweight_test.hpp>typedef boost::error_info<struct tag_test_int,int> test_data;structexception1:    std::exception    {    };structexception2:    std::exception,    boost::exception    {    };voidboost_throw_exception_test()    {    try        {        BOOST_THROW_EXCEPTION(exception1());        BOOST_TEST(false);        }    catch(    boost::exception & x )        {        boost::shared_ptr<char const * const> file=boost::get_error_info<boost::throw_function>(x);        boost::shared_ptr<char const * const> function=boost::get_error_info<boost::throw_file>(x);        boost::shared_ptr<int const> line=boost::get_error_info<boost::throw_line>(x);        BOOST_TEST( file && *file );        BOOST_TEST( function && *function );        BOOST_TEST( line && *line==32 );        }    catch(    ... )        {        BOOST_TEST(false);        }    try        {        BOOST_THROW_EXCEPTION(exception2() << test_data(42));        BOOST_TEST(false);        }    catch(    boost::exception & x )        {        boost::shared_ptr<char const * const> file=boost::get_error_info<boost::throw_function>(x);        boost::shared_ptr<char const * const> function=boost::get_error_info<boost::throw_file>(x);        boost::shared_ptr<int const> line=boost::get_error_info<boost::throw_line>(x);        boost::shared_ptr<int const> data=boost::get_error_info<test_data>(x);        BOOST_TEST( file && *file );        BOOST_TEST( function && *function );        BOOST_TEST( line && *line==52 );        BOOST_TEST( data && *data==42 );        }    catch(    ... )        {        BOOST_TEST(false);        }    }voidthrow_fwd( void (*thrower)(int) )    {    try        {        thrower(42);        }    catch(    boost::exception & x )        {        x << test_data(42);        throw;        }    }template <class T>voidtester()    {    try        {        throw_fwd( &boost::exception_test::throw_test_exception<T> );        BOOST_ASSERT(false);        }    catch(    ... )        {        boost::exception_ptr p = boost::current_exception();        try            {            rethrow_exception(p);            BOOST_TEST(false);            }        catch(        T & y )            {#ifdef BOOST_NO_RTTI            try                {                throw;                }            catch(            boost::exception & y )                {#endif                BOOST_TEST(boost::get_error_info<test_data>(y));                if( boost::shared_ptr<int const> d=boost::get_error_info<test_data>(y) )                    BOOST_TEST(*d==42);#ifdef BOOST_NO_RTTI                }            catch(            ... )                {                BOOST_TEST(false);                }#endif            BOOST_TEST(y.x_==42);            }        catch(        ... )            {            BOOST_TEST(false);            }        }    }intmain()    {    boost_throw_exception_test();    tester<boost::exception_test::derives_boost_exception>();    tester<boost::exception_test::derives_boost_exception_virtually>();    tester<boost::exception_test::derives_std_exception>();    return boost::report_errors();    }

⌨️ 快捷键说明

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