C ++程序设计 第15 章 异常 程序中经常要检查处理各种错误情形,如果用传统的流程控制语句来处理,很容易使程序逻辑混乱。异常(exception)就是一种专门用于检测错误并处理的一种机制,使程序保持逻辑清晰,并改进程序的可靠性。C++语言提供了基本的异常处理机制。本章主要介绍异常的概念、语句、异常类型架构及应用。 可靠的编程应尽可能地、及时地检测到各种异常情形,尽可能在本地处理。尽管有时自己不能处理,也应该向调用方提供详细的出错信息,使调用方能得到充分信息,从而采取合适方式来处理异常。 15.1 异常的概念 异常是什么概念?异常就是在程序运行中发生的难以预料的、不正常的事件而导致偏离正常流程的现象。例如: 访问数组元素的下标越界,在越界时又写入了数据; 用new 动态申请内存而返回空指针(可能是因内存不足); 算术运算上溢出或下溢出; 整数除法中除数为 0; 调用函数时提供了无效实参,如指针实参为空指针(如用空指针来调用strlen 函数); 通过挂空指针或挂空引用来访问对象; 输入整数或浮点数失败; I/O 错误,等等。 上面列出的情形之一如果发生,就可能导致运行错误而终止程序。 发生异常将导致正常流程不能进行,就需要对异常进行处理。那么异常处理是什么概念?异常处理(exception handling)就是在运行时刻对异常进行检测、捕获、提示、传递等过程。如果采用传统的if-else 语句来检测处理所有可能发生的异常,很容易导致程序流程混乱,分不清正常流程与异常处理,而且在处理一个异常时往往又引入了新的异常。 假设要设计一个函数,从一个文本文件中读取数据得到一个 float 矩阵。该文件应存放一个 m*n 的float 矩阵,头两个整数说明其行数 m 和列数 n。你要把它读入并创建一个矩阵对象,以备下一步计算。如果你认为文本文件不会有错,完全按正常编程,不超过 10 条语句就能完成。如果这个文本文件是别人提供的,而且你的函数将提供给其它人使用,那么你在每一步都要考虑可能出现的错误,此时就可能需要30 条语句来处理。例如,可能的出错情形如下: 打开文件出错,文件名可能有误; 读取行数 m 或者列数 n 可能出错; 读取每个元素时都可能出错; 矩阵数据可能不完整,也会出错。 如果你用传统方式来判断处理以上这些问题,就会发现正常的流程被淹没在多种异常判断处理之中。此时就需要有一种统一的机制能将正常流...