4.9.5 包装标准异常
exception库提供一个模板函数enable_error_info<T>(T &e),其中T是标准异常类或者其他自定义类型。它可以包装类型T,产生一个从boost::exception和T派生的类,从而在不修改原异常处理体系的前提下获得boost::exception的所有好处。如果类型T已经是boost::exception的子类,那么enable_error_info将返回e的一个拷贝。
enable_error_info()通常用在程序中已经存在异常类的场合,对这些异常类的修改很困难甚至不可能(比如已经编译成库)。这时候enable_error_info()就可以包装原有的异常类,从而很容易地在不变动任何已有代码的基础上把boost::exception集成到原有异常体系中。
示范enable_error_info()用法的代码如下:
- #include <boost/exception/all.hpp>
- struct my_err{}; //某个自定义的异常类,未使用boost::exception
- int main()
- {
- using namespace boost;
- try
- {
- //使用enable_error_info包装自定义异常
- throw enable_error_info(my_err()) << errinfo_errno(10);
- }
- catch (boost::exception& e) //这里必须使用boost::exception来捕获
- {
- cout << *get_error_info<errinfo_errno>(e)<<endl;
- }
- }
注意代码中catch的用法,enable_error_info()返回的对象是boost::exception和my_err的子类,catch的参数可以是这两者中的任意一个,但如果要使用boost:: exception所存储的信息,就必须用boost::exception来捕获异常。
enable_error_info()也可以包装标准库的异常:
- throw enable_error_info(std::runtime_error("runtime"))
- << errinfo_at_line(__ LINE __); //包装标准异常