《第12章异常处理优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第12章异常处理优秀PPT.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第12章异常处理章异常处理现在学习的是第1页,共25页2本章主要内容本章主要内容l异常处理的基本思想异常处理的基本思想lC+异常处理的实现异常处理的实现l异常处理中的构造与析构异常处理中的构造与析构l标准程序库异常处理标准程序库异常处理l小结小结现在学习的是第2页,共25页3异常处理的基本思想异常处理的基本思想函数f()捕获并处理异常函数h()引发异常函数g()调用者异常传播方向调用关系异常处理的基本思想现在学习的是第3页,共25页4异常处理的执行过程异常处理的执行过程l抛掷异常的程序段抛掷异常的程序段.throw 表达式;.l捕获并处理异常的程序段捕获并处理异常的程序段try 复合语句ca
2、tch(异常声明)复合语句catch(异常声明)复合语句 保护段异常处理程序C+异常处理的实现现在学习的是第4页,共25页5异常处理的执行过程(续)异常处理的执行过程(续)l若有异常则通过若有异常则通过throwthrow操作创建一个异常对象并抛掷。操作创建一个异常对象并抛掷。l将可能抛出异常的程序段嵌在将可能抛出异常的程序段嵌在trytry块之中。控制通过正常的顺块之中。控制通过正常的顺序执行到达序执行到达trytry语句,然后执行语句,然后执行trytry块内的保护段。块内的保护段。l如果在保护段执行期间没有引起异常,那么跟在如果在保护段执行期间没有引起异常,那么跟在trytry块后的块后
3、的catchcatch子句就不执行。程序从子句就不执行。程序从trytry块后跟随的最后一个块后跟随的最后一个catchcatch子句后面的语句继续执行下去。子句后面的语句继续执行下去。lcatchcatch子句按其在子句按其在trytry块后出现的顺序被检查。匹配的块后出现的顺序被检查。匹配的catchcatch子句将捕获并处理异常(或继续抛掷异常)。子句将捕获并处理异常(或继续抛掷异常)。l如果匹配的处理器未找到,则运行库函数如果匹配的处理器未找到,则运行库函数terminateterminate将被自动调将被自动调用,其缺省功能是调用用,其缺省功能是调用abortabort终止程序。终止
4、程序。C+异常处理的实现现在学习的是第5页,共25页6例例12-1处理除零异常处理除零异常#include#include using namespace std;using namespace std;int divide(int x,int y)int divide(int x,int y)if(y=0)if(y=0)throw x;throw x;return x/y;return x/y;int main()int main()try try cout 5/2=divide(5,2)endl;cout 5/2=divide(5,2)endl;cout 8/0=divide(8,0)en
5、dl;cout 8/0=divide(8,0)endl;cout 7/1=divide(7,1)endl;cout 7/1=divide(7,1)endl;catch(int e)catch(int e)cout e is divided by zero!endl;cout e is divided by zero!endl;cout That is ok.endl;cout That is ok.endl;return 0;return 0;程序运行结果如下:程序运行结果如下:5/2=25/2=28 is divided by zero!8 is divided by zero!That i
6、s ok.That is ok.C+异常处理的实现现在学习的是第6页,共25页7异常接口声明异常接口声明l可以在函数的声明中列出这个函数可可以在函数的声明中列出这个函数可能抛掷的所有异常类型。能抛掷的所有异常类型。例如:void fun()throw(A,B,C,D);l若无异常接口声明,则此函数可以抛若无异常接口声明,则此函数可以抛掷任何类型的异常。掷任何类型的异常。l不抛掷任何类型异常的函数声明如下:不抛掷任何类型异常的函数声明如下:void fun()throw();C+异常处理的实现现在学习的是第7页,共25页8异常处理中的构造与析构异常处理中的构造与析构l找到一个匹配的找到一个匹配的
7、catch异常处理后异常处理后初始化异常参数。将从对应的try块开始到异常被抛掷处之间构造(且尚未析构)的所有自动对象进行析构。从最后一个catch处理之后开始恢复执行。异常处理的构造与析构现在学习的是第8页,共25页9例例12-2 异常处理时的析构异常处理时的析构#include#include#include#include using namespace std;using namespace std;class MyException class MyException public:public:MyException(const string&message):MyExceptio
8、n(const string&message):message(message)message(message)MyException()MyException()const string&getMessage()const return const string&getMessage()const return message;message;private:private:string message;string message;异常处理的构造与析构现在学习的是第9页,共25页class Demo class Demo public:public:Demo()cout Construct
9、or of Demo endl;Demo()cout Constructor of Demo endl;Demo()cout Destructor of Demo Demo()cout Destructor of Demo endl;endl;void func()throw(MyException)void func()throw(MyException)Demo d;Demo d;cout Throw MyException in func()cout Throw MyException in func()endl;endl;throw MyException(exception thro
10、wn by throw MyException(exception thrown by func();func();10现在学习的是第10页,共25页int main()int main()cout In main function endl;cout In main function endl;try try func();func();catch(MyException&e)catch(MyException&e)cout Caught an exception:cout Caught an exception:e.getMessage()endl;e.getMessage()endl;c
11、out Resume the execution of main()endl;cout Resume the execution of main()endl;return 0;return 0;11现在学习的是第11页,共25页程序运行时输出程序运行时输出:In main functionConstructor of DemoThrow MyException in func()Destructor of DemoCaught an exception:exception thrown by func()Resume the execution of main()12现在学习的是第12页,共2
12、5页标准程序库异常处理标准程序库异常处理13标准程序库异常处理现在学习的是第13页,共25页标准程序库的异常类标准程序库的异常类lexception:标准程序库异常类的公共基:标准程序库异常类的公共基类类llogic_error表示可以在程序中被预先检测表示可以在程序中被预先检测到的异常到的异常如果小心地编写程序,这类异常能够避免lruntime_error表示难以被预先检测的异表示难以被预先检测的异常常14标准程序库异常处理现在学习的是第14页,共25页例例12-3:计算三角形面积:计算三角形面积l编写一个计算三角形面积的函数,函数的参数为编写一个计算三角形面积的函数,函数的参数为三角形三边
13、边长三角形三边边长a、b、c,三角形面积用,三角形面积用Heron公式计算。公式计算。l在计算三角形面积的函数中需要判断输入的参数在计算三角形面积的函数中需要判断输入的参数a、b、c是否构成一个三角形,是否构成一个三角形,若三个边长不能构若三个边长不能构成三角形,则需要抛出异常成三角形,则需要抛出异常。15标准程序库异常处理#include#include#include#include#include#include using namespace std;using namespace std;现在学习的是第15页,共25页double area(double a,double b,dou
14、ble c)throw double area(double a,double b,double c)throw(invalid_argument)(invalid_argument)/判断三角形边长是否为正判断三角形边长是否为正if(a=0|b=0|c=0)if(a=0|b=0|c=0)throw invalid_argument(the side length should be throw invalid_argument(the side length should be positive);positive);/判断三边长是否满足三角不等式判断三边长是否满足三角不等式if(a+b=c
15、|b+c=a|c+a=b)if(a+b=c|b+c=a|c+a=b)throw invalid_argument(the side length should fit throw invalid_argument(the side length should fit the triangle inequation);the triangle inequation);/由由HeronHeron公式计算三角形面积公式计算三角形面积double s=(a+b+c)/2;double s=(a+b+c)/2;return sqrt(s*(s-a)*(s-b)*(s-c);return sqrt(s*(
16、s-a)*(s-b)*(s-c);16现在学习的是第16页,共25页int main()int main()double a,b,c;double a,b,c;/三角形三边长三角形三边长cout Please input the side lengths of a cout a b c;cin a b c;try try double s=area(a,b,c);/double s=area(a,b,c);/尝试计算三角形面积尝试计算三角形面积cout Area:s endl;cout Area:s endl;catch(exception&e)catch(exception&e)cout E
17、rror:e.what()endl;cout Error:e.what()endl;return 0;return 0;17现在学习的是第17页,共25页程序运行时输出程序运行时输出1:Please input the side lengths of a triangle:3 4 5Area:6程序运行时输出程序运行时输出2:Please input the side lengths of a triangle:0 5 5Error:the side length should be positive程序运行时输出程序运行时输出3:Please input the side lengths o
18、f a triangle:1 2 4Error:the side length should fit the triangle inequation18现在学习的是第18页,共25页什么是异常安全什么是异常安全(1)l一个异常安全的函数,在有异常抛出时:一个异常安全的函数,在有异常抛出时:不应泄露任何资源不能使任何对象进入非法状态l反例:例反例:例9-8中的下列代码:中的下列代码:template template void Stack:push(const T&item)void Stack:push(const T&item)assert(!isFull();assert(!isFull(
19、);/如果栈满了,则报错如果栈满了,则报错list+top=item;list+top=item;/将新元素压入栈顶将新元素压入栈顶 l如果赋值过程中有异常抛出,由于如果赋值过程中有异常抛出,由于top已经增已经增1,栈顶的内,栈顶的内容将变得不确定。容将变得不确定。19现在学习的是第19页,共25页什么是异常安全什么是异常安全(2)l该函数的修正版本:该函数的修正版本:template template void Stack:push(const T&item)void Stack:push(const T&item)assert(!isFull();assert(!isFull();/如果
20、栈满了,则报错如果栈满了,则报错listtop+1=item;/listtop+1=item;/将新元素压入栈顶将新元素压入栈顶top+;top+;l即使赋值时抛出异常,由于此时即使赋值时抛出异常,由于此时top并没有真正增并没有真正增1,因此当前对象的状态没有改变,该函数是异常安因此当前对象的状态没有改变,该函数是异常安全的。全的。20现在学习的是第20页,共25页编写异常安全程序的原则编写异常安全程序的原则l明确哪些操作绝对不会抛掷异常明确哪些操作绝对不会抛掷异常这些操作是异常安全编程的基石例:基本数据类型的绝大部分操作,针的赋值、算术运算和比较运算,STL容器的swap函数l尽量确保析构
21、函数不抛掷异常尽量确保析构函数不抛掷异常21现在学习的是第21页,共25页避免异常发生时的资源泄漏避免异常发生时的资源泄漏l一个函数,必须在有异常向外抛出前,释一个函数,必须在有异常向外抛出前,释放应由它负责释放的资源。放应由它负责释放的资源。l通常的解决方案通常的解决方案把一切动态分配的资源都包装成栈上的对象,利用抛掷异常时自动调用对象析构函数的特性来释放资源。对于必须在堆上构造的对象,可以用智能指针auto_ptr加以包装。22现在学习的是第22页,共25页智能指针智能指针auto_ptr(1)lC+标准库的一个类模板标准库的一个类模板在memory头文件中定义有一个类型参数X,表示智能指
22、针指向数据的类型每个智能指针对象关联一个普通指针l构造函数:构造函数:explicit auto_ptr(X*p=0)throw();l获得与智能指针对象关联的指针:获得与智能指针对象关联的指针:X*get()const throw();由于auto_ptr的“*”与“-”运算符已被重载,对一个auto_ptr的对象使用“*”和“-”,等价于对它所关联的指针使用相应运算符。23现在学习的是第23页,共25页智能指针智能指针auto_ptr(2)l更改智能指针对象关联的指针更改智能指针对象关联的指针void reset(X*p=0)throw();原指针所指堆对象会被删除l解除与当前指针的关联解除与当前指针的关联X*release()throw();l注意事项注意事项智能指针对象执行赋值和拷贝构造时,原对象的关联指针会被解除24现在学习的是第24页,共25页25小结与复习建议小结与复习建议l主要内容主要内容异常处理的基本思想、C+异常处理的实现、异常处理中的构造与析构l达到的目标达到的目标简单了解C+的异常处理机制l实验任务实验任务实验十二现在学习的是第25页,共25页