异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持。C++语言中,异常处理包括:
- throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发(rise)了异常
- try语句块,异常处理部分使用try语句块处理异常。 try语句块以关键字try开始,并以一或多个catch子句结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句‘处理’异常,所以它们也被称作异常代码处理。
- 一套异常类,用于在throw表达式和相关的catch子句之间传递异常的具体信息。
5.6.1 throw表达式
throw表达式包含关键字throw和紧随其后的一个表达式,通常后面会跟一个分号
if(item1.isbn() != item2.isbn())
throw runtime_error("Data must refer to same ISBN")
该异常类型是类型 runtime_error 的对象,抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码。
runtime_error是标准库异常类型的一种,定义在stdexcept头文件中,必须初始化
5.6.2 try语句块
try {
program-statements
} catch (exception-declaration){
handler-statements
}
.
.
.
}
//....
try后跟一个块
块后面一或多个catch语句
catch子句包括三部分:关键字 catch , 括号内一个(可能未命名的)对象的声明(称作异常声明)以及一个块
catch一旦完成调转到try语句块最后一个catch子语句之后的那条语句
try语句块内声明的变量在块外部无法访问,也别是在catch子句内也无法访问
编写处理代码
try{
//抛出runtime_error异常
} catch(runtime_error err){
cout << err.what()
}
//........
what是runtime_error类的一个函数成员
每个标准库异常类都定义了名为what的成员函数,返回值是(const char*)c风格字符串
会输出 Data must refer to same ISBN
函数寻找处理代码的过程中退出
当异常抛出后,首先搜索抛出异常的函数。如果没有匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找。如果还是没有catch,新函数也会被终止,知道找到catch为止
如果最终还是没能找到任何匹配的catch子句,程序转到名为terminate的标准库函数。该函数的行为于系统有关,一般情况下,执行该函数将导致程序非正常退出
没有try语句块定义的异常,也就没有匹配的catch,系统也会调用terminate
提示:编写异常安全的代码非常困难
异常期间清理工作的程序被称为异常安全的代码
超出此书知识
5.6.3 标准异常
C++定义了一组类,用于报告标准库函数遇到的问题
- exception头文件定义了最通用的异常类 exception。它只报告异常的发生,不提供任何额外信息。
- stdxcept 头文件定义了集中常用的异常类,在表5.1
- new 头文件定义了bad_alloc异常类型 在407页介绍
- type_info 头文件定义了 bad_cast 异常类型 在731页介绍
表5.1 <stdexcept>定义的异常类
exception | 最常见的问题 |
runtime_error | 只有在运行时才能检测出的问题 |
range_error | 运行时错误:生成的结果超出了有意义的值域范围 |
等等 -------p176