1 //Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. 2 3 //Distributed under the Boost Software License, Version 1.0. (See accompanying 4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #include <boost/exception/errinfo_api_function.hpp> 7 #include <boost/exception/errinfo_at_line.hpp> 8 #include <boost/exception/errinfo_errno.hpp> 9 #include <boost/exception/errinfo_file_handle.hpp> 10 #include <boost/exception/errinfo_file_name.hpp> 11 #include <boost/exception/errinfo_file_open_mode.hpp> 12 #include <boost/exception/errinfo_type_info_name.hpp> 13 #include <boost/exception/info.hpp> 14 #include <boost/exception/get_error_info.hpp> 15 #include <boost/throw_exception.hpp> 16 #include <boost/weak_ptr.hpp> 17 #include <boost/detail/lightweight_test.hpp> 18 #include <exception> 19 20 struct 21 test_exception: 22 virtual boost::exception, 23 virtual std::exception 24 { 25 }; 26 27 int main()28main() 29 { 30 using namespace boost; 31 try 32 { 33 test_exception e; 34 e << 35 errinfo_api_function("failed_api_function") << 36 errinfo_at_line(42) << 37 errinfo_errno(0) << 38 errinfo_file_handle(weak_ptr<FILE>()) << 39 errinfo_file_name("filename.txt") << 40 errinfo_file_open_mode("rb"); 41 #ifdef BOOST_NO_TYPEID 42 BOOST_THROW_EXCEPTION(e); 43 #else 44 BOOST_THROW_EXCEPTION(e<<errinfo_type_info_name(typeid(int).name())); 45 #endif 46 BOOST_ERROR("BOOST_THROW_EXCEPTION failed to throw."); 47 } 48 catch( 49 boost::exception & e ) 50 { 51 BOOST_TEST(get_error_info<errinfo_api_function>(e) && *get_error_info<errinfo_api_function>(e)==std::string("failed_api_function")); 52 BOOST_TEST(get_error_info<errinfo_at_line>(e) && *get_error_info<errinfo_at_line>(e)==42); 53 BOOST_TEST(get_error_info<errinfo_errno>(e) && *get_error_info<errinfo_errno>(e)==0); 54 BOOST_TEST(get_error_info<errinfo_file_handle>(e) && get_error_info<errinfo_file_handle>(e)->expired()); 55 BOOST_TEST(get_error_info<errinfo_file_name>(e) && *get_error_info<errinfo_file_name>(e)=="filename.txt"); 56 BOOST_TEST(get_error_info<errinfo_file_open_mode>(e) && *get_error_info<errinfo_file_open_mode>(e)=="rb"); 57 #ifndef BOOST_NO_TYPEID 58 BOOST_TEST(get_error_info<errinfo_type_info_name>(e) && *get_error_info<errinfo_type_info_name>(e)==typeid(int).name()); 59 #endif 60 } 61 catch( 62 ... ) 63 { 64 BOOST_TEST(false); 65 } 66 return boost::report_errors(); 67 } 68