1. 概念
异常说明/规范(exception specification)指定, 如果函数抛出异常, 被抛出的异常将是包含在该说明中的一种, 或者是从列出的异常中派生的类型.
2. 定义
异常说明跟在函数形参表之后. 一个异常说明在关键字throw之后跟着一个(可能为空的)由圆括号括起来的异常类型列表. 如:
这个声明指出, foo是接受int值的函数, 返回void. 如果foo抛出一个异常, 该异常将是std::logic_error或std::runtime_error对象, 或者由std::logic_error或std::runtime_error派生的类型的异常.
3. 说明
- 编译时, 编译器不能也不会试图验证异常说明;
- 空说明列表指出函数不抛出任何异常;
- 如果一个函数声明没有指定异常说明, 则该函数可以抛出任意类型的异常;
- 异常说明是函数接口的一部分, 函数定义以及该函数的任意声明必须具有相同的异常说明;
- 异常说明不能用于函数重载;
- 在const成员函数声明中, 异常说明跟在const限定符之后;
- 如果函数抛出了没有在其异常说明中列出的异常, 就调用标准库函数unexpected. 默认情况下, unexpected函数调用terminate函数, terminate函数一般会终止程序;
- 异常说明/规范中不仅要包含函数本身引发的异常, 还应该包含该函数调用的其它函数引发的异常, 以此类推;
- 引发异常时, 编译器总是创建一个临时拷贝, 即使catch块中指定的是引用(这里指定引用的目的并不是避免创建拷贝以提高效率, 而是: 基类引用可以执行派生类对象.). 如:
4. 代码