ImageVerifierCode 换一换
格式:PPT , 页数:31 ,大小:2.24MB ,
文档编号:3376563      下载积分:25 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-3376563.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(三亚风情)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(C++面向对象程序设计-09-异常处理.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

C++面向对象程序设计-09-异常处理.ppt

1、第 9 章 异常处理学习目标 理解异常处理的基本思想 掌握异常处理的实现方法2目录9.1 异常处理基本思想9.2 异常处理的实现9.3 综 合 实 例39.1 异常处理基本思想 程序运行的异常问题:除数为零,数组越界,内存空间不够,无法打开输入文件,输入数据的类型有错等。解决方法:在小型程序中,方法简单,通过判别并显示出错信息就能解决。在大型软件中,函数之间的互相调用以及异常处理会让程序变得非常复杂和庞大。C+异常处理机制的本质:将错误检测代码和错误处理代码分离。例9-1 不使用异常处理来处理错误的示例。输入三角形的三边长a、b、c,求三角形的面积。#include#include using

2、 namespace std;int main()double triangle(double,double,double);double a,b,c;cinabc;while(a0&b0&c0)coutarea=triangle(a,b,c)abc;return 0;double triangle(double a,double b,double c)double area;double s=(a+b+c)/2;area=sqrt(s*(sa)*(sb)*(sc);return area;运行结果:3 4 5area=61 2 5area=1.#IND2 0 1结果错误无法输出例9-2 使用

3、异常处理来处理错误的示例。设置异常处理,对不符合构成三角形条件的输出警告信息。#include#include using namespace std;int main()double triangle(double,double,double);double a,b,c;cinabc;try while(a0&b0&c0)cout area=triangle(a,b,c)abc;catch(double)couta=a,b=b,c=c,that is not a traingle!endl;coutendendl;return 0;double triangle(double a,doubl

4、e b,double c)double s=(a+b+c)/2;if(a+b=c|b+c=a|c+a=b)throw a;return sqrt(s*(s-a)*(s-b)*(s-c);运行结果:3 4 5area=61 2 5a=1,b=2,c=5,that is not a traingle!end说明 程序首先把可能出现异常放在try后面 按正常的顺序执行到try块,如果没有出现异常,会跳过catch继续执行。如果发生异常,则throw语句抛出一个异常信息。执行了throw语句后,不会执行triangle函数中的if语句之后的return语句。异常处理后,程序并不会自动终止,而是会继续执

5、行catch子句后面的语句,程序输出end。9.2 异常处理的实现 9.2.1 异常处理基本语法定义try /可能出错产生异常的代码 throw表达式;catch(type1)/对应类型的异常处理代码catch(type2)/对应类型的异常处理代码说明(1)一个函数可以只有一个try,而无catch,即在此函数中只检查并不处理,把catch放在其他函数中。(2)只能有一个try,却可以有多个catch,以便与不同的异常匹配。catch只检查异常类型,并不检查它们的值。trycatch(int)catch(double)catch(char)说明(3)以下表示可以捕捉任何类型的异常信息catch

6、()必须放在try-catch结构的最后,相当于“其他”。类似于switch中的default。(4)如果throw抛出的异常信息找不到与之匹配的catch块,那么系统让程序终止运行。例9-3 多种异常类型的处理示例。输入一个学生的考试总分及科目数,计算并输出该生的平均分。程序能同时捕获除数为0和输入为负数的异常。#includeusingnamespacestd;floatDiv(floatscore,intn)if(n=0)/除数为0时抛出异常thrown;if(n0|score0)/总分或者科目数为负数时抛出异常throwscore;returnscore/n;void main()fl

7、oat score,ave;int n;while(1)coutscoren;try ave=Div(score,n);coutaverage=aveendl;catch(int)cout error:科目数为0 endl;/捕获int型异常 catch(float)cout error:总分或科目数为负数endl;/捕获float型异常 运行结果:输入总分和科目数:599 5average=119.8输入总分和科目数:599 0error:科目数为0输入总分和科目数:599 5error:总分或科目数为负数输入总分和科目数:610 5average=1229.2.2 定义异常类处理异常 在以

8、上例子中,抛出的异常是int型或者float型的数据,catch时根据throw抛出数据的类型来区分。如果抛出的异常种类很多,int或float这些基本数据类型不够。这就需要程序员自定义各种异常类型。C+为异常处理提供了友好的支持,用户可以自定义异常类型,也可以是自定义的类。例9-4 输入一个学生的考试总分及科目数,计算并输出该生的平均分。通过定义异常类的方式来处理除数为0和输入为负的异常。#include using namespace std;/定义除数为0异常类ZeroExceptionclass ZeroExceptionpublic:ZeroException(char*str)ms

9、g=str;char*show()return msg;private:char*msg;/定义总分或科目数为负数异常类NegativeExceptionclass NegativeExceptionpublic:NegativeException(char*str)msg=str;char*show()return msg;private:char*msg;/定义除法函数division,除数为0或者输入为负数都将抛出异常float division(float score,int n)if(n=0)/除数为0时抛出异常 throw ZeroException(error:科目数为0);if

10、(n0|score0)/总分或者科目数为负数时抛出异常 throw NegativeException(error:总分或科目数为负数);return score/n;int main()/定义主函数测试异常类 float score,result;int n;coutscoren)try result=division(score,n);coutaverage=resultendl;catch(ZeroException)cout error:科目数为0 endl;/捕获int型异常 catch(NegativeException)cout error:总分或科目数为负数endl;/捕获fl

11、oat型异常 cout输入总分和科目数:;return 0;运行结果:输入总分和科目数:599 5average=119.8输入总分和科目数:599 0error:科目数为0输入总分和科目数:599-5error:总分或科目数为负数输入总分和科目数:610 5average=122基类和派生类的异常 如果一个catch语句能够捕获基类的异常,那么它也可以捕获其派生类的异常。如果捕获基类异常的catch语句在前,则捕获其派生类异常的catch语句就会失效,因此,应该注意正确安排catch语句的顺序。在一般情况下,将处理基类异常的catch语句放在处理其派生类异常的catch语句之后。哪个在前,哪

12、个在后?例9-5a 异常类的派生示例(catch基类在前,catch派生类在后)。#include using namespace std;class base/定义基类public:void show()coutBase objectendl;class derived:public base/定义派生类public:void show()coutDerived objectendl;int main()int no;coutno)try if(no%2=0)/抛出基类对象 throw base();else /抛出派生类对象 throw derived();catch(base b)cou

13、t Exception:;b.show();catch(derived d)cout Exception:;d.show();cout输入一个整数:;return 0;运行结果:输入一个整数:1Exception:Base object输入一个整数:2Exception:Base object由于派生类被认为是与基类同类型的,所以catch(base b)捕获了所有基类和派生类的异常,相当于令catch(derived d)语句失效。例9-5b 异常类的派生示例(catch派生类在前,catch基类在后)。#include using namespace std;class base/定义基类

14、public:void show()coutBase objectendl;class derived:public base/定义派生类public:void show()coutDerived objectendl;int main()int no;coutno)try if(no%2=0)/抛出基类对象 throw base();else /抛出派生类对象 throw derived();catch(derived d)cout Exception:;d.show();catch(base b)cout Exception:;b.show();cout输入一个整数:;return 0;运

15、行结果:输入一个整数:1Exception:Derived object输入一个整数:2Exception:Base object调用throw derived()时,会先捕获派生类异常catch(derived d),后捕获基类异常catch(base b)。9.2.3 异常处理中的构造与析构 如果try块中定义了类对象,要调用构造函数。如果发生了异常,此时流程立即离开try块。因此,应当做好结束对象前的清理工作。C+的异常处理机制会在throw抛出异常信息被catch捕获时,调用相应类对象的析构函数,析构对象的顺序与构造的顺序相反,然后执行与异常信息匹配的catch块中的语句。例9-6 异

16、常处理中析构函数的调用示例。#include#include using namespace std;class Tri public:Tri(int x,int y,int z)coutConstructor is called.endl;if(x+y)z|(x+z)y|(y+z)x)throw x;a=x;b=y;c=z;Tri()coutDestructor is called.endl;double area(int a,int b,int c)double m=(a+b+c)/2;double s=sqrt(m*(ma)*(mb)*(mc);return s;void display

17、()couta=a,b=b,c=c:area=area(a,b,c)endl;private:int a,b,c;例9-6 (续)int main()try Tri S1(1,2,5);S1.display();catch(int)coutThese sides can not constructor a triange!n;return 0;运行结果:Constructor is called.These sides can not constructor a triange!如果把主函数中的Tri S1(1,2,5)改为Tri S1(3,4,5),输出结果是什么?9.3 综 合 实 例 例

18、9-8 exceptions综合实例。/*name:exceptions.cpp function:学习C+Premier 的笔记之异常处理discribe:抛出自定义异常类对象、抛出内置类型对象(如int)。*/#include#include using namespace std;#define TYPE_CLASS 0 /抛出自定义类类型对象的异常#define TYPE_INT 1 /抛出整型的异常#define TYPE_ENUM 2 /抛出枚举的异常#define TYPE_FLOAT 3 /抛出float的异常#define TYPE_DOUBLE 4 /抛出double的异常

19、typedef int TYPE;/异常的类型enum WeekMonday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;class MyException /自定义的异常类public:MyException(string msg)err_msg=msg;void ShowErrorMsg()cerrerr_msgendl;MyException()private:string err_msg;/抛出异常的函数/其中 throw(MyException,int,Week)被称为异常规范,它告诉了编译器,该函数不会抛出其他类型的异常/异常

20、规范可以不写,系统默认为可以抛出任何类型的异常/如果一个异常没有被捕获,则会被系统调用terminate处理/如果一个异常类型,没有被写入异常规范,则使用catch无法捕获。但它会被系统调用terminate捕获 void KindsOfException(TYPE type)throw(MyException,int,Week,float,double)switch(type)case TYPE_CLASS:throw MyException(Exception!Type of Class);/类 break;case TYPE_INT:throw 2011;/整型 break;case T

21、YPE_ENUM:throw Monday;/枚举 break;case TYPE_FLOAT:throw 1.23f;/float break;case TYPE_DOUBLE:throw 1.23;/double break;default:break;int main()int type;for(int i=0;i5;i+)couttype;try KindsOfException(type);catch(MyException e)/如果使用了throw 异常规范,但是没将MyException写入throw列表,就不能捕获到MyException异常,该异常会被terminate处理

22、 e.ShowErrorMsg();catch(float f)cerrfloatfendl;catch(double d)cerrdoubledendl;catch(int i)cerriendl;catch(Week week)cerrweek2011Input the type(0,1,2,3,4):2Exception!Type of Enum-0Input the type(0,1,2,3,4):3float1.23Input the type(0,1,2,3,4):4double1.23小结异常处理的基本思想是:让一个函数在发现了自己无法处理的错误时抛出一个异常,然后让它的(直接或间接)调用者能够处理这个问题。C+异常处理机制的本质是将错误检测代码和错误处理代码分离。异常处理的任务是:对所能预料到的运行错误进行处理,从而使得程序在出错后可以继续运行。try、throw、catch是C+中用于实现异常处理的机制。31

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|