1、第十二章第十二章 异常处理异常处理清华大学清华大学郑郑 莉莉C+语言程序设计C+语言程序设计清华大学 郑莉2本章主要内容本章主要内容l异常处理的基本思想异常处理的基本思想lC+异常处理的实现异常处理的实现l异常处理中的构造与析构异常处理中的构造与析构C+语言程序设计清华大学 郑莉3异常处理的基本思想异常处理的基本思想函数f()捕获并处理异常函数h()引发异常函数g()调用者异常传播方向调用关系C+语言程序设计清华大学 郑莉4异常处理的实现机制异常处理的实现机制l抛掷异常的程序段抛掷异常的程序段.throw 表达式;.l捕获并处理异常的程序段捕获并处理异常的程序段try 复合语句catch(异常
2、类型声明)复合语句catch(异常类型声明)复合语句 C+语言程序设计清华大学 郑莉5异常处理的实现机制异常处理的实现机制l若有异常则通过若有异常则通过throwthrow操作创建一个异常对象并抛掷。操作创建一个异常对象并抛掷。l将可能抛出异常的程序段嵌在将可能抛出异常的程序段嵌在trytry块之中。控制通过正块之中。控制通过正常的顺序执行到达常的顺序执行到达trytry语句,然后执行语句,然后执行trytry块内的保护段。块内的保护段。l如果在保护段执行期间没有引起异常,那么跟在如果在保护段执行期间没有引起异常,那么跟在trytry块块后的后的catchcatch子句就不执行。程序从子句就不
3、执行。程序从trytry块后跟随的最后一块后跟随的最后一个个catchcatch子句后面的语句继续执行下去。子句后面的语句继续执行下去。lcatchcatch子句按其在子句按其在trytry块后出现的顺序被检查。匹配的块后出现的顺序被检查。匹配的catchcatch子句将捕获并处理异常(或继续抛掷异常)。子句将捕获并处理异常(或继续抛掷异常)。l如果匹配的处理器未找到,则运行函数如果匹配的处理器未找到,则运行函数terminateterminate将被将被自动调用,其缺省功能是调用自动调用,其缺省功能是调用abortabort终止程序。终止程序。C+语言程序设计清华大学 郑莉6例例12-1处理
4、除零异常处理除零异常#include#includeint Div(int x,int y);int Div(int x,int y);void main()void main()trytry cout5/2=Div(5,2)endl;cout5/2=Div(5,2)endl;cout8/0=Div(8,0)endl;cout8/0=Div(8,0)endl;cout7/1=Div(7,1)endl;cout7/1=Div(7,1)endl;catch(int)catch(int)coutexcept of deviding zero.n;coutexcept of deviding zero
5、.n;coutthat is ok.n;coutthat is ok.n;int Div(int x,int y)int Div(int x,int y)if(y=0)throw y;if(y=0)throw y;return x/y;return x/y;程序运行结果如下:程序运行结果如下:5/2=25/2=2except of deviding zero.except of deviding zero.that is ok.that is ok.C+语言程序设计清华大学 郑莉7异常接口声明异常接口声明l可以在函数的声明中列出这个函数可可以在函数的声明中列出这个函数可能抛掷的所有异常类型。能
6、抛掷的所有异常类型。例如:void fun()throw(A,B,C,D);l若无异常接口声明,则此函数可以抛若无异常接口声明,则此函数可以抛掷任何类型的异常。掷任何类型的异常。l不抛掷任何类型异常的函数声明如下:不抛掷任何类型异常的函数声明如下:void fun()throw();C+语言程序设计清华大学 郑莉8异常处理中的构造与析构异常处理中的构造与析构l找到一个匹配的找到一个匹配的catch异常处理后:异常处理后:初始化参数。将从对应的try块开始到异常被抛掷处之间构造(且尚未析构)的,所有自动对象进行析构。从最后一个catch处理之后开始恢复执行。C+语言程序设计清华大学 郑莉9例例1
7、2-2 异常处理时的析构异常处理时的析构#include#include void MyFunc(void);void MyFunc(void);class Exptclass Expt public:public:Expt();Expt();Expt();Expt();const char*ShowReason()const const char*ShowReason()const return Expt return Expt类异常。类异常。;class Democlass Demo public:public:Demo();Demo();Demo();Demo();Demo:Demo()
8、Demo:Demo()cout cout构造构造 Demo.endl;Demo.endl;Demo:Demo()Demo:Demo()cout cout析构析构 Demo.endl;Demo.endl;10void MyFunc()void MyFunc()Demo D;Demo D;cout cout在在MyFunc()MyFunc()中抛掷中抛掷ExptExpt类异常。类异常。endl;endl;throw Expt();throw Expt();int main()int main()cout cout在在mainmain函数中。函数中。endl;endl;try try cout co
9、ut在在trytry块中,调用块中,调用MyFunc()MyFunc()。endl;endl;MyFunc();MyFunc();11 catch(Expt E)catch(Expt E)cout cout在在catchcatch异常处理程序中。异常处理程序中。endl;endl;cout cout捕获到捕获到ExptExpt类型异常:类型异常:;coutE.ShowReason()endl;coutE.ShowReason()endl;catch(char*str)catch(char*str)cout cout捕获到其它的异常:捕获到其它的异常:strendl;strendl;cout cout回到回到mainmain函数。从这里恢复执行。函数。从这里恢复执行。endl;endl;return 0;return 0;12程序运行时输出程序运行时输出:在main函数中。在try块中,调用MyFunc()。构造 Demo.在MyFunc()中抛掷Expt类异常。析构 Demo.在catch异常处理程序中。捕获到Expt类型异常:Expt类异常。回到main函数。从这里恢复执行。13