第11章 异常处理
1
本章学习要求:
o 异常的概念
o C++程序中的异常处理
2
11.1 异常的概念
处理程序中的错误对于任何一个程序设计者来讲都是不陌生的,程序中的错
误通常包括三类:语法错误、逻辑错误和运行异常。
语法错误是指程序中源代码的书写不符合语言的语法规范.
逻辑错误(或语义错误)是指程序设计不当而造成程序不能完成预期的功能
。
运行异常是指由程序运行环境问题造成的程序异常中止。 如,程序提出内
存分配申请,但内存空间不足;程序运行时要打开文件,但在硬盘中的该文
件被删除或移走等等,这些情况都会造成运行异常。
导致程序运行异常的错误是不可以避免的,因为程序的实际运行环
境通常不是由程序员所能够严格控制的,可能会随时发生变化,但是运行异
常是可以预料的,程序员可以通过分析程序和运行环境的交互,从而获知运
行环境可能的异常情况,并在程序中,对各种可能的异常情况进行预先的处
理,以使程序在各种情况下都能尽可能的正确顺利运行。
3
11.2 C++的异常处理机制
C++中使用异常处理机制包括:
抛出异常。
捕获异常。
处理异常。
C++中使用throw抛出异常,使用try…catch捕获和处理异常。
4
11.2.1 抛出异常throw
抛出异常的语法格式如下:
throw [<表达式>];
如果某段程序中发现了自己不能处理的异常情况,就可以使用该方式
抛出这个异常,将它抛给调用该段程序的函数。其中,表达式值的类
型称为异常类型,它可以是任意的C++的类型(void除外),包括C++
的类。如:
throw 1; //抛出一个异常,该异常为int类型,值为1
throw “number error”; //抛出一个异常,该异常为char*类型,值为字符
串的首地址。
在执行完throw语句后,系统将不执行throw后面的语句,而是直接跳
到异常处理语句部分进行异常的处理。
5
11.2.2 捕获和处理异常try、catch
对于被调用函数抛出的异常,调用函数需要进行捕获,并给出相应的处理。
C++中捕获和处理异常使用try…catch语句块,语法格式如下:
try {
...... //可能抛出异常的语句序列
}
catch(<异常类型名1> [<异常对象名>]){
...... //异常处理代码
}
catch(<异常类型名2> [<异常对象名>]){
...... //异常处理代码
}
…
catch(<异常类型名n> [<异常对象名>]){
...... //异常处理代码
}
6
若try内的代码抛出一个异常,则在内部“throw表达式;”代码执行
后,立即跳转到try后的catch块列表中,按照catch块出现的先后顺
序,查找<异常类型名>和抛出的异常对象的类型相同的catch块。
若找到,将抛出的异常对象的值赋值给对应catch块的<异常对象名
>,并进入该catch块执行(类似一个函数调用过程)。执行完该
catch块代码后,跳过和其并列的其它的catch块到try…catch后面
的语句执行。
7
cout << "抛出异常前";
throw "program exception";
cout << "抛出异常后";
cout << "bool exception";
cout << p << endl;
try{
}
catch(bool b){
}
catch(char* p){
}
catch(int i){
cout << "int exception";
}
cout << "异常处理结束";
该段代码执行将输出:
抛出异常前program exception
异常处理结束
8