详解异常处理(Exception Handling) 及标准库异常处理类
异常处理,英文名为exceptional handling, 是代替日渐衰落的error code方法的新法,提供error code 所未能具体的优势。异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。 异常处理(又称为错误处理)功能提供了处理程序运行时出现的任何意外或异常情况的方法。异常处理使用 try、catch关键字来尝试可能未成功的操作,处理失败,以及在事后清理资源。
异常处理概述
异常处理是为了处理程序异常终止,并且能够显示得找到错误发生的位置。
程序终止有两种途径
- 执行正常结束而终止。
- 程序执行中发生错误或特殊事件而终止(异常终止)。
而异常处理机制的基本思想,就是采用结构化方法对程序的运行时错误进行显式管理!从而
- 处理可预料的错误或特殊事件。
- 将程序中的正常处理代码与异常处理代码显式区别开来,提高程序的可读性。
C++语言中的异常处理
基本思想:
将异常检测与异常处理分离,异常检测部分检测到异常的存在时,抛出一个异常对象给异常处理代码。通过该异常对象,独立开发的异常检测部分和异常处理部分能够就程序执行期间所出现的异常情况进行通信。
执行机制:
- 若有异常则通过throw操作创建一个异常对象并抛出。
- 将可能抛出异常的程序段放在try块之中。控制通过正常顺序执行到达try块,然后执行try子块内的保护段。
- 如果在保护段执行期间没有引发异常,那么跟在try子块后的catch字句就不执行。程序继续执行紧跟try块最后一个catch子句后面的语句。
- catch子句按其在try块后出现的顺序被检查。类型匹配的catch子句将被捕获并处理异常(或重抛出异常)
- 如果找不到匹配的处理代码,则自动调用terminate,默认为abort()终止程序。
throw语句
用于抛出异常,一般为
- throw 表达式;
- throw; // 重抛出异常
表达式的结果类型可为任意内置类型或用户自定义类型。
执行throw语句时,首先被创建被抛出对象的副本,然后将该对象副本传递到异常处理代码所在的位置,即某个catch语句的位置。
void just_throw() {
throw MyException("inValid argument");
}
try语句
一般形式为:
try {
program-statements;
} catch(exception-declaration) {
handler-statements;
}
…
异常声明可以是单个类型名,单个对象声明或者为…(任意对象)
异常捕获
如果执行try语句抛出异常,则在catch子句中搜索相应的异常处理代码,异常类型的匹配规则为:
- 被抛出异常的类型与catch子句声明的类型相同。
- 被抛出异常的类型是catch子句声明的类型子类型。(public dereived)
注意!基类类型的处理代码一定要放在最后面,用来处理未被捕获到的异常代码。
异常处理代码的搜索
理解这个知识点对于调用带有异常抛出的函数有很大的好处。
假如现在我们设计一个程序如下:
#include <iostream>