第12章异常处理PPT讲稿.ppt

上传人:石*** 文档编号:42767880 上传时间:2022-09-16 格式:PPT 页数:25 大小:1.26MB
返回 下载 相关 举报
第12章异常处理PPT讲稿.ppt_第1页
第1页 / 共25页
第12章异常处理PPT讲稿.ppt_第2页
第2页 / 共25页
点击查看更多>>
资源描述

《第12章异常处理PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第12章异常处理PPT讲稿.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第12章异常处理章异常处理第1页,共25页,编辑于2022年,星期日2本章主要内容本章主要内容l异常处理的基本思想异常处理的基本思想lC+异常处理的实现异常处理的实现l异常处理中的构造与析构异常处理中的构造与析构l标准程序库异常处理标准程序库异常处理l小结小结第2页,共25页,编辑于2022年,星期日3异常处理的基本思想异常处理的基本思想函数f()捕获并处理异常函数h()引发异常函数g()调用者异常传播方向调用关系异常处理的基本思想第3页,共25页,编辑于2022年,星期日4异常处理的执行过程异常处理的执行过程l抛掷异常的程序段抛掷异常的程序段.throw 表达式;.l捕获并处理异常的程序段

2、捕获并处理异常的程序段try 复合语句catch(异常声明)复合语句catch(异常声明)复合语句 保护段异常处理程序C+异常处理的实现第4页,共25页,编辑于2022年,星期日5异常处理的执行过程(续)异常处理的执行过程(续)l若有异常则通过若有异常则通过throwthrow操作创建一个异常对象并抛掷。操作创建一个异常对象并抛掷。l将可能抛出异常的程序段嵌在将可能抛出异常的程序段嵌在trytry块之中。控制通过正常的块之中。控制通过正常的顺序执行到达顺序执行到达trytry语句,然后执行语句,然后执行trytry块内的保护段。块内的保护段。l如果在保护段执行期间没有引起异常,那么跟在如果在保

3、护段执行期间没有引起异常,那么跟在trytry块后的块后的catchcatch子句就不执行。程序从子句就不执行。程序从trytry块后跟随的最后一个块后跟随的最后一个catchcatch子子句后面的语句继续执行下去。句后面的语句继续执行下去。lcatchcatch子句按其在子句按其在trytry块后出现的顺序被检查。匹配的块后出现的顺序被检查。匹配的catchcatch子子句将捕获并处理异常(或继续抛掷异常)。句将捕获并处理异常(或继续抛掷异常)。l如果匹配的处理器未找到,则运行库函数如果匹配的处理器未找到,则运行库函数terminateterminate将被自动将被自动调用,其缺省功能是调用

4、调用,其缺省功能是调用abortabort终止程序。终止程序。C+异常处理的实现第5页,共25页,编辑于2022年,星期日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=div

5、ide(5,2)endl;cout 8/0=divide(8,0)endl;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

6、by zero!8 is divided by zero!That is ok.That is ok.C+异常处理的实现第6页,共25页,编辑于2022年,星期日7异常接口声明异常接口声明l可以在函数的声明中列出这个函数可可以在函数的声明中列出这个函数可能抛掷的所有异常类型。能抛掷的所有异常类型。例如:void fun()throw(A,B,C,D);l若无异常接口声明,则此函数可以抛若无异常接口声明,则此函数可以抛掷任何类型的异常。掷任何类型的异常。l不抛掷任何类型异常的函数声明如下:不抛掷任何类型异常的函数声明如下:void fun()throw();C+异常处理的实现第7页,共25页,编

7、辑于2022年,星期日8异常处理中的构造与析构异常处理中的构造与析构l找到一个匹配的找到一个匹配的catch异常处理后异常处理后初始化异常参数。将从对应的try块开始到异常被抛掷处之间构造(且尚未析构)的所有自动对象进行析构。从最后一个catch处理之后开始恢复执行。异常处理的构造与析构第8页,共25页,编辑于2022年,星期日9例例12-2 异常处理时的析构异常处理时的析构#include#include#include#include using namespace std;using namespace std;class MyException class MyException pu

8、blic:public:MyException(const string&message):MyException(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页,编辑于20

9、22年,星期日class Demo class Demo public:public:Demo()cout Constructor of Demo Demo()cout Constructor of Demo endl;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()endl;cout T

10、hrow MyException in func()endl;throw MyException(exception thrown by throw MyException(exception thrown by func();func();10第10页,共25页,编辑于2022年,星期日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 exce

11、ption:cout Caught an exception:e.getMessage()endl;e.getMessage()endl;cout Resume the execution of main()endl;cout Resume the execution of main()endl;return 0;return 0;11第11页,共25页,编辑于2022年,星期日程序运行时输出程序运行时输出:In main functionConstructor of DemoThrow MyException in func()Destructor of DemoCaught an exce

12、ption:exception thrown by func()Resume the execution of main()12第12页,共25页,编辑于2022年,星期日标准程序库异常处理标准程序库异常处理13标准程序库异常处理第13页,共25页,编辑于2022年,星期日标准程序库的异常类标准程序库的异常类lexception:标准程序库异常类的公共基:标准程序库异常类的公共基类类llogic_error表示可以在程序中被预先检表示可以在程序中被预先检测到的异常测到的异常如果小心地编写程序,这类异常能够避免lruntime_error表示难以被预先检测的异表示难以被预先检测的异常常14标准程

13、序库异常处理第14页,共25页,编辑于2022年,星期日例例12-3:计算三角形面积:计算三角形面积l编写一个计算三角形面积的函数,函数的参数为编写一个计算三角形面积的函数,函数的参数为三角形三边边长三角形三边边长a、b、c,三角形面积用,三角形面积用Heron公式计算。公式计算。l在计算三角形面积的函数中需要判断输入的参在计算三角形面积的函数中需要判断输入的参数数a、b、c是否构成一个三角形,是否构成一个三角形,若三个边长不若三个边长不能构成三角形,则需要抛出异常能构成三角形,则需要抛出异常。15标准程序库异常处理#include#include#include#include#includ

14、e#include using namespace std;using namespace std;第15页,共25页,编辑于2022年,星期日double area(double a,double b,double 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 t

15、hrow invalid_argument(the side length should be positive);positive);/判断三边长是否满足三角不等式判断三边长是否满足三角不等式if(a+b=c|b+c=a|c+a=b)if(a+b=c|b+c=a|c+a=b)throw invalid_argument(the side length should fit the throw invalid_argument(the side length should fit the triangle inequation);triangle inequation);/由由HeronHer

16、on公式计算三角形面积公式计算三角形面积double s=(a+b+c)/2;double s=(a+b+c)/2;return sqrt(s*(s-a)*(s-b)*(s-c);return sqrt(s*(s-a)*(s-b)*(s-c);16第16页,共25页,编辑于2022年,星期日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);/doub

17、le s=area(a,b,c);/尝试计算三角形面积尝试计算三角形面积cout Area:s endl;cout Area:s endl;catch(exception&e)catch(exception&e)cout Error:e.what()endl;cout Error:e.what()endl;return 0;return 0;17第17页,共25页,编辑于2022年,星期日程序运行时输出程序运行时输出1:Please input the side lengths of a triangle:3 4 5Area:6程序运行时输出程序运行时输出2:Please input the

18、side lengths of a triangle:0 5 5Error:the side length should be positive程序运行时输出程序运行时输出3:Please input the side lengths of a triangle:1 2 4Error:the side length should fit the triangle inequation18第18页,共25页,编辑于2022年,星期日什么是异常安全什么是异常安全(1)l一个异常安全的函数,在有异常抛出时:一个异常安全的函数,在有异常抛出时:不应泄露任何资源不能使任何对象进入非法状态l反例:例反例:

19、例9-8中的下列代码:中的下列代码:template template void Stack:push(const T&item)void Stack:push(const T&item)assert(!isFull();assert(!isFull();/如果栈满了,则报错如果栈满了,则报错list+top=item;list+top=item;/将新元素压入栈顶将新元素压入栈顶 l如果赋值过程中有异常抛出,由于如果赋值过程中有异常抛出,由于top已经增已经增1,栈顶,栈顶的内容将变得不确定。的内容将变得不确定。19第19页,共25页,编辑于2022年,星期日什么是异常安全什么是异常安全(2

20、)l该函数的修正版本:该函数的修正版本:template template void Stack:push(const T&item)void Stack:push(const T&item)assert(!isFull();assert(!isFull();/如果栈满了,则报错如果栈满了,则报错listtop+1=item;/listtop+1=item;/将新元素压入栈顶将新元素压入栈顶top+;top+;l即使赋值时抛出异常,由于此时即使赋值时抛出异常,由于此时top并没有真正增并没有真正增1,因此当前对象的状态没有改变,该函数是异常安因此当前对象的状态没有改变,该函数是异常安全的。全的

21、。20第20页,共25页,编辑于2022年,星期日编写异常安全程序的原则编写异常安全程序的原则l明确哪些操作绝对不会抛掷异常明确哪些操作绝对不会抛掷异常这些操作是异常安全编程的基石例:基本数据类型的绝大部分操作,针的赋值、算术运算和比较运算,STL容器的swap函数l尽量确保析构函数不抛掷异常尽量确保析构函数不抛掷异常21第21页,共25页,编辑于2022年,星期日避免异常发生时的资源泄漏避免异常发生时的资源泄漏l一个函数,必须在有异常向外抛出前,释一个函数,必须在有异常向外抛出前,释放应由它负责释放的资源。放应由它负责释放的资源。l通常的解决方案通常的解决方案把一切动态分配的资源都包装成栈上

22、的对象,利用抛掷异常时自动调用对象析构函数的特性来释放资源。对于必须在堆上构造的对象,可以用智能指针auto_ptr加以包装。22第22页,共25页,编辑于2022年,星期日智能指针智能指针auto_ptr(1)lC+标准库的一个类模板标准库的一个类模板在memory头文件中定义有一个类型参数X,表示智能指针指向数据的类型每个智能指针对象关联一个普通指针l构造函数:构造函数:explicit auto_ptr(X*p=0)throw();l获得与智能指针对象关联的指针:获得与智能指针对象关联的指针:X*get()const throw();由于auto_ptr的“*”与“-”运算符已被重载,对

23、一个auto_ptr的对象使用“*”和“-”,等价于对它所关联的指针使用相应运算符。23第23页,共25页,编辑于2022年,星期日智能指针智能指针auto_ptr(2)l更改智能指针对象关联的指针更改智能指针对象关联的指针void reset(X*p=0)throw();原指针所指堆对象会被删除l解除与当前指针的关联解除与当前指针的关联X*release()throw();l注意事项注意事项智能指针对象执行赋值和拷贝构造时,原对象的关联指针会被解除24第24页,共25页,编辑于2022年,星期日25小结与复习建议小结与复习建议l主要内容主要内容异常处理的基本思想、C+异常处理的实现、异常处理中的构造与析构l达到的目标达到的目标简单了解C+的异常处理机制l实验任务实验任务实验十二第25页,共25页,编辑于2022年,星期日

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁