简介

典型的异常包括失去数据库连接以及遇到意外输入等,异常处理机制为程序中异常检测和异常处理两部分的协作提供支持:

  • thorw表达式:throw表达式用于表示它遇到了无法处理的问题,我们说throw引发了异常
  • try语句块:异常处理部分使用try语句块处理异常,它以关键字try开始,并以一个或多个catch子句结束
  • 异常类:用于在throw表达式和catch子句之间传递异常的具体信息

throw表达式

程序的异常检测部分用throw表达式抛出一个异常:

  1. #include <stdexcept>
  2. throw runtime_error("tomocat");

try语句块

try语句块的语法是:

Tips:try语句块内声明的变量在块外部无法访问,特别是在catch子句内也无法访问。

  1. try {
  2. program-statements
  3. } catch (exception-declaration) {
  4. handler-statements
  5. } catch (exception-declaration) {
  6. handler-statements
  7. }

例子:

  1. while (cin >> item1 >> item2) {
  2. try {
  3. // 执行item1和item2的操作, 失败了抛出runtime_error异常
  4. } catch (runtime_error err) {
  5. cout << err.what() << endl;
  6. }
  7. }

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_allocbad_cast
  • 对于除exception、bad_allocbad_cast的异常类,我们应该用string对象或者C风格字符串初始化这些类型的对象,不允许使用默认初始化的方式
  • 异常类只定义了一个名为what的成员函数,返回一个提供错误信息的C风格字符串
  • 如果异常类型有一个字符串初始值,那么what方法返回该字符串;对于其他无初始值的异常类型来说,what返回的内容由编译器决定