4.9.1 标准库中的异常
为了使用boost.exception,我们需要先了解C++(www.cppentry.com)98标准规定的异常体系。
C++(www.cppentry.com)98标准中定义了一个异常基类std::exception和try/catch/throw异常处理机制,std::exception又派生出若干子类,用以描述不同种类的异常,如bad_alloc、bad_cast、out_of_range等等,共同构建了C++(www.cppentry.com)异常处理框架。
C++(www.cppentry.com)允许任何类型作为异常抛出,但在std::exception出现后,我们应该尽量使用它,因为std::exception提供了一个很有用的成员函数what(),可以返回异常所携带的信息,这比简单地抛出一个整数错误值或者字符串更好、更安全。
如果std::exception及其子类不能满足程序对异常处理的要求,我们也可以继承它,为它添加更多的异常诊断信息。例如,想要为异常增加错误码信息可以这样:
- class my_exception : public std::exception //继承标准库异常类
- {
- private:
- int err_no; //错误码信息
- public:
- my_exception(const char* msg, int err): //构造函数
- std::exception(msg),err_no(err) {} //初始化父类和错误码信息
- int get_err_no() //获取自定义的错误码信息
- { return err_no;}
- };
但当系统中需要很多不同种类的异常时,这种实现方法很快就成为了程序员的沉重负担--为了容纳不同的信息需要编写大量极其相似的代码。
而且,这种解法还存在一个问题:很多时候当发生异常时不能获得有关异常的完全诊断信息,而标准库的异常类一旦被抛出,它就成为了一个"死"对象,程序失去了对它的控制能力,只能使用它或者再抛出一个新的异常。
C++(www.cppentry.com)98标准的异常处理机制还不够完美,需要boost.exception来完善。
接下来的讨论在说到exception时,如果不特别指明,均是指boost::exception类,标准库的异常使用std::exception。