4.9.2 类摘要
exception库提供两个类:exception和error_info,它们是exception库的基础。
exception的类摘要如下:
- class exception
- {
- protected:
- exception();
- exception( exception const & x );
- ~exception();
- template <class E,class Tag,class T>
- private:
- friend E const & operator<<( E const &, error_info<Tag,T> const & );
- };
- template <class ErrorInfo,class E>
- typename ErrorInfo::error_info::value_type * get_error_info( E & x );
exception类几乎没有公开的成员函数(但有大量用于内部实现的私有函数和变量),被保护的构造函数表明了它的设计意图:它是一个抽象类,除了它的子类,任何人都不能创建或者销毁它,这保证了exception不会被误用。
exception的重要能力在于其友元操作符<<,可以存储error_info对象的信息,存入的信息可以用自由函数get_error_info<>()随时再取出来。这个函数返回一个存储数据的指针,如果exception里没有这种类型的信息则返回空指针。
exception特意没有从std::exception继承,因为现实中已存的大量代码已经有很多std::exception的子类,而如果exception也是std::exception的子类,对exception再使用继承可能会引发"钻石型"多重继承问题。
error_info的类摘要如下:
- template <class Tag,class T>
- class error_info
- {
- public:
- typedef T value_type;
-
- error_info( value_type const & v );
- value_type & value();
- };
error_info提供了向异常类型添加信息的通用解法。第一个模板类型参数Tag是一个标记,我们已经在3.11节(第91页)见过了类似的用法。它通常(最好)是一个空类,仅用来标记error_info类,使它在模板实例化时生成不同的类型。第二个模板类型参数T是真正存储的信息数据,可以用成员函数value()访问。