C++异常机制使用了三个的关键字
throw ──抛出一个异常
try ──标识可能出现的异常代码段
catch ──处理异常的代码段

异常,当一个函数发现自己无法处理的错误时会抛出异常,让函数的调用者
直接或间接的来处理这个问题。

1.异常的抛出和捕获

  • 异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个处理代码
  • 被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个
  • 抛出异常后会释放局部存储对象,所以被抛出的对象也就还给系统了,throw表达式会初始化一个抛出特殊的异常对象副本(匿名对象),异常对象由编译管理,异常对象在传给对应的catch处理之后撤销

2.栈展开

  • 抛出异常的时候,将暂停当前函数的执行,开始查找对应的匹配catch子句。首先检查throw本身是否在try块内部,如果是,再查找匹配的catch语句。如果有匹配的,则处理;没有则退出当前函数栈,继续在调用函数的栈中进行查找,不断重复上述过程。
  • 若到达main函数的栈,依旧没有匹配的,则终止程序。上述这个沿着调用链查找匹配的catch子句的过程称为栈展开。找到匹配的catch子句并处理以后,会继续沿着catch子句后面继续执行

3.异常捕获的匹配规则

异常对象的类型与catch说明符的类型必须完全匹配。只有以下几种情况例外:

  • 允许从非const对象到const的转换
  • 允许从派生类型到基类类型的转换
  • 将数组转换为指向数组类型的指针,将函数转换为指向函数类型的指针

4.异常重新抛出

  • 有可能单个的catch不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层的调用链函数来处理,catch则可以通过重新抛出将异常传递给更上层的函数进行处理