欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

(八)boost库之异常处理

发布时间:2024/4/11 编程问答 60 豆豆
生活随笔 收集整理的这篇文章主要介绍了 (八)boost库之异常处理 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

当你面对上千万行的项目时,当看到系统输出了异常信息时,你是否想过,如果它能将文件名、行号等信息输出,该多好啊,曾经为此绞尽脑汁。

      今天使用boost库,将轻松的解决这个问题。

1、boost异常的基本用法

先看看使用STL中的异常类的一般做法:

// 使用STL定义自己的异常 class MyException : public std::exception { public: MyException(const char * const &msg):exception(msg) { } MyException(const char * const & msg, int errCode):exception(msg, errCode) { } }; void TestException() { try { throw MyException("error"); } catch(std::exception& e) { std::cout << e.what() << std::endl; } }

boost库的实现方案为:

//使用Boost定义自己的异常 #include <boost/exception/all.hpp> class MyException : virtual public std::exception,virtual public boost::exception { }; //定义错误信息类型, typedef boost::error_info<struct tag_err_no, int> err_no; typedef boost::error_info<struct tag_err_str, std::string> err_str; void TestException() { try { throw MyException() << err_no(10) << err_str("error"); } catch(std::exception& e) { std::cout << *boost::get_error_info<err_str>(e) << std::endl; } }

 

boost库将异常类和错误信息分离了,使得错误信息可以更加灵活,其中typedef boost::error_info<struct tag_err_no, int> err_no;

定义一个错误信息类,tag_err_no无实际意义,仅用于标识,为了让同一类型可以实例化多个错误信息类而存在。

 

2、使用boost::enable_error_info将标准异常类转换成boost异常类

class MyException : public std::exception{}; #include <boost/exception/all.hpp> typedef boost::error_info<struct tag_err_no, int> err_no; typedef boost::error_info<struct tag_err_str, std::string> err_str; void TestException() { try { throw boost::enable_error_info(MyException()) << err_no(10) << err_str("error"); } catch(std::exception& e) { std::cout << *boost::get_error_info<err_str>(e) << std::endl; } }

有了boost的异常类,在抛出异常时,可以塞更多的信息了,如函数名、文件名、行号。

3、使用BOOST_THROW_EXCEPTION让标准的异常类,提供更多的信息

// 使用STL定义自己的异常 class MyException : public std::exception { public: MyException(const char * const &msg):exception(msg) { } MyException(const char * const & msg, int errCode):exception(msg, errCode) { } }; #include <boost/exception/all.hpp> void TestException() { try { //让标准异常支持更多的异常信息 BOOST_THROW_EXCEPTION(MyException("error")); } catch(std::exception& e) { //使用diagnostic_information提取所有信息 std::cout << boost::diagnostic_information(e) << std::endl; } }

 

我们几乎不用修改以前的异常类,就能让它提供更多的异常信息。

总结

以上是生活随笔为你收集整理的(八)boost库之异常处理的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。