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

上传人(卖家):三亚风情 文档编号:3376563 上传时间:2022-08-25 格式:PPT 页数:31 大小:2.24MB
下载 相关 举报
C++面向对象程序设计-09-异常处理.ppt_第1页
第1页 / 共31页
C++面向对象程序设计-09-异常处理.ppt_第2页
第2页 / 共31页
C++面向对象程序设计-09-异常处理.ppt_第3页
第3页 / 共31页
C++面向对象程序设计-09-异常处理.ppt_第4页
第4页 / 共31页
C++面向对象程序设计-09-异常处理.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

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


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

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


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