#include <boost/shared_ptr.hpp> #include <boost/exception/all.hpp> #include <iostream> using namespace std; // 从std和boost,新的导常类就同时有它们两的能力 struct both_exception: virtual boost::exception, // 这里要用虚继承 virtual std::exception {}; // 定义异常both_exception内部异常信息的数据类型 // 这样异常信息就可以是各种类型 typedef boost::error_info<struct tag_err_str, string> err_str; void stdException() { try { int err(100); throw(err); cout<< "程序是不会执行到这里的!"<<endl; } catch (int &e) { cout<< e <<endl; throw; // 将异常继续往上一层抛,抛出的数据是*a, // 如果e是对象而不是引用或指针时这点要分清楚 } } void bothException() { try { try { throw both_exception() << err_str("This is a string error!"); // 内部的数据类型为std::string } catch(both_exception& e) { cout<< *boost::get_error_info<err_str>(e); // 获取异常信息内部的数据(err_str的string) throw; // 将异常继续向上一层抛 } } catch(both_exception& e) // 处理异常,stdException向上抛出异常是给调用它的函数处理,这里不同 { cout<< *boost::get_error_info<err_str>(e); } } int main() { try { stdException(); } catch(int& e) // 捕获stdException();最后throw;语句抛出的异常 { cout<<e<<endl; } bothException(); getchar(); return 0; }
boost::exception 的几种使用方法,不包含线程传递异常
#include <iostream> #include <boost/shared_ptr.hpp> #include <boost/exception/all.hpp> #include <boost/tuple/detail/tuple_basic.hpp> #include <string> using namespace std; struct bothException: boost::exception, std::exception { }; // 定义异常的数据类 // typedef boost::error_info<struct no_err_tag, int> no_err; // typedef boost::error_info<struct str_err_tag, string> str_err; // 更简单的用法 #define DEFINE_ERROR_INFO(type, name)/ typedef boost::error_info<struct tag##__FILE__##__LINE__##type, type> name; DEFINE_ERROR_INFO(int, no_err); DEFINE_ERROR_INFO(string, str_err); int main() { // 第一种 // 虚继承得到的异常类 try { throw bothException() << no_err(10) << str_err("/nThis is a string error!/n"); } catch (bothException& e) { cout << *boost::get_error_info<no_err>(e) << *boost::get_error_info<str_err>(e); } // 第二种 // 用enable_error_info得到boost::exception和std::runtime_error共同派生的子异常类 try { // boost::enable_error_info 的参数可以是任意自定义的类型 throw boost::enable_error_info(std::runtime_error("Test")) // 不需要虚继承boost::exception << str_err("/nThis is a string error!") << boost::errinfo_file_name(__FILE__) // 抛出异常的cpp文件 << boost::errinfo_at_line(__LINE__); // 抛出异常的行 } catch(boost::exception & e) // 形参可以是boost::exception 和 std::rutime_error { cout<< *boost::get_error_info<boost::errinfo_file_name>(e)<<endl; cout<< *boost::get_error_info<boost::errinfo_at_line>(e)<<endl; } // 第三种 // 使用异常函数 try { boost::throw_exception(std::runtime_error("Funtion throw exception")); } catch(std::runtime_error& e) { cout<< e.what() << endl; } // 第四种 // 使用宏 BOOST_THROW_EXCEPTION 自动添加异常的函数名,文件名,和行号,方便调试 // 使用diagnostic_information() 函数可输出异常所包含的所有信息 try { BOOST_THROW_EXCEPTION(std::logic_error("This is a exception test")); } catch(boost::exception& e) { cout<<boost::diagnostic_information(e)<<endl; // 输出异常里的所有信息 cout<<boost::current_exception_diagnostic_information()<<endl; // 输出异常里的所有信息,只能在catch块中使用 } // throw_exception() BOOST_THROW_EXCEPTION 必须从std::exception 和 boost::exception 继承 // 第五种 // 使用tuple打包异常 typedef boost::tuple<boost::errinfo_api_function, boost::errinfo_errno> err_group; try { throw boost::enable_error_info(std::out_of_range("out")) << err_group("syslogd", 91); } catch(boost::exception&) { cout<< boost::current_exception_diagnostic_information() << endl; } getchar(); return 0; }