异常处理对于程序健壮性而言十分重要,现将异常处理这部分初步学习总结一下。
异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。处理反常行为也是设计所有系统最难的一部分
异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持,在C++语言中,异常处理包括:
1.throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发了异常。
2.try语句块,异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或者多个catch子句结束。try语句块中代码抛出来的异常通常会被某个catch子句处理。因为catch子句处理异常,所以他们被叫做异常处理代码。
3.一套异常类。用于throw表达式和相关的catch子句之间传递异常的具体信息。
下面分别介绍一下异常处理的三个组成部分:
throw表达式
程序的异常检测部分使用throw表达式引发一个异常。throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。throw表达式后面通常紧跟一个分号,从而构成一条表达式语句。
简单的实例如下
该简单实例中,如果除数是0就抛出一个异常,该异常是类型runtime_error的对象。抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码。(类型runtime_error是标准库异常类型的一种,定义在stdexcept头文件中。我们必须初始化runtime_error的对象,方式是给它提供一个string或者一个C风格的字符串(const char*),这个字符串中有一些关于异常的辅助消息)
try语句块
try语句块通用语法形式是
try {
programe-statements
} catch ( exception-declaration) {
handler-statements
} catch ( exception-declaration) {
handler-statements
} //........
跟在try语句块之后的是一个或者多个catch子句。catch 子句包括三部分:关键字catch,括号内一个对象的声明(称作异常声明),以及一个块。当选中了某个catch子句处理异常之后,执行相应的语句块。catch子句一旦执行完成,程序跳转到try语句块最后一个catch子句之后的那句语句继续执行。
简单的实例如下:
程序在运行过程中,如果没有找到相应匹配的catch子句,程序一般转到名为terminate的标准库函数,该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出。
C++标准库定义了一组类,用于报告标准库函数遇到的问题。这些异常类也可以在用户编写的程序中使用,他们分别在4个头文件中:
1.exception头文件定义了最通用的异常类exception.它只报告异常的发生,不提供任何额外信息。
2.stdexcept头文件定义了几种常见的异常类。
3.new头文件定义了bad_alloc异常类型。
4.type_info头文件定义了bad_cast异常类型。