简介
典型的异常包括失去数据库连接以及遇到意外输入等,异常处理机制为程序中异常检测和异常处理两部分的协作提供支持:
- thorw表达式:throw表达式用于表示它遇到了无法处理的问题,我们说throw引发了异常
- try语句块:异常处理部分使用try语句块处理异常,它以关键字try开始,并以一个或多个catch子句结束
- 异常类:用于在throw表达式和catch子句之间传递异常的具体信息
throw表达式
程序的异常检测部分用throw表达式抛出一个异常:
#include <stdexcept>throw runtime_error("tomocat");
try语句块
try语句块的语法是:
Tips:try语句块内声明的变量在块外部无法访问,特别是在catch子句内也无法访问。
try {program-statements} catch (exception-declaration) {handler-statements} catch (exception-declaration) {handler-statements}
例子:
while (cin >> item1 >> item2) {try {// 执行item1和item2的操作, 失败了抛出runtime_error异常} catch (runtime_error err) {cout << err.what() << endl;}}
Tips:如果一个程序没有try语句块且发生了异常,系统会调用terminate函数并终止当前程序的执行。当异常被抛出时,首先搜索该异常的函数,如果没能找到匹配的catch子句,那么终止该函数并在调用该函数的函数中继续寻找。如果还是没找到匹配的catch子句,这个新的函数也被终止,继续搜索调用它的函数。如果最终还是没能找到任何匹配的catch子句,系统会调用terminate函数并终止当前程序的执行。
标准异常
1. C++标准库异常
C++标准库定义了一组类用于报告标准库遇到的问题,它们分别定义在4个头文件中:
- exception头文件中定义了最通用的异常类exception,它只报告异常的发生,不提供任何额外信息
- stdexcept头文件中定义了几种常用的异常类,后续会列举
- new头文件中定义了
bad_alloc异常类型 type_info头文件中定义了bad_cast异常类型
2. stdexcept定义的异常
stdexcept头文件中定义的异常类如下:
| 异常类 | 含义 |
|---|---|
| exception | 最常见的问题 |
| runtime_error | 只有在运行时才能检测出的问题 |
| range_error | 运行时错误:生成的结果超出了有意义的值域范围 |
| overflow_error | 运行时错误:计算上溢 |
| underflow_error | 运行时错误:计算下溢 |
| logic_error | 程序逻辑错误 |
| domian_error | 逻辑错误:参数对应的结果值不存在 |
| invalid_argument | 逻辑错误:无效参数 |
| length_error | 逻辑错误:试图创建一个超出该类型最大长度的对象 |
| out_of_range | 逻辑错误:使用一个超出有效范围的值 |
3. 注意事项
- 我们只能以默认初始化的方式初始化exception、
bad_alloc和bad_cast - 对于除exception、
bad_alloc和bad_cast的异常类,我们应该用string对象或者C风格字符串初始化这些类型的对象,不允许使用默认初始化的方式 - 异常类只定义了一个名为what的成员函数,返回一个提供错误信息的C风格字符串
- 如果异常类型有一个字符串初始值,那么what方法返回该字符串;对于其他无初始值的异常类型来说,what返回的内容由编译器决定
