面向对象程序设计08-1.异常处理_第1页
面向对象程序设计08-1.异常处理_第2页
面向对象程序设计08-1.异常处理_第3页
面向对象程序设计08-1.异常处理_第4页
面向对象程序设计08-1.异常处理_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《面向对象程序设计》八、异常处理1/15/20231第9章异常处理内容提要程序中潜在的异常问题异常处理机制C++中的异常处理标准异常使用异常处理应注意的几个问题1/15/20232第9章异常处理提出问题【例】求解一元二次方程ax2+bx+c=0#include<iostream>#include<cmath>usingnamespacestd;intmain(){ floata,b,c; doublex1,x2;

cout<<"请输入一元二次方程的系数a、b和c的值:";

cin>>a>>b>>c; x1=(-b+sqrt(b*b-4*a*c))/2*a; x2=(-b-sqrt(b*b-4*a*c))/2*a;

cout<<"方程的实根是:x1="<<x1<<"x2="<<x2<<endl; return0;}1/15/20233第9章异常处理程序中潜在的异常问题问题的分析能够正常运行的程序可能存在很多潜在隐患。程序运行时可以检测到的一些非正常情况称为异常(Exception)。如除数为0,数组越界访问,内存空间不够,输入输出不正常(文件找不到、输入数据类型错等)等等。异常是程序错误一种形式。程序中的错误按性质可分为:语法错误(关键字拼写错、标识符未定义、语句不完整等)逻辑错误(算法设计有误导致得不到期望结果)异常(出现是不可避免的,必须加以控制和处理)1/15/20234第9章异常处理异常处理机制需要进行异常处理,从而减少异常对程序运行的影响,提高程序的容错性。异常处理机制提供了系统层次上的标准设施,其主要任务有以下几点:能够在异常发生时,在执出点抛出异常,并将有关异常的信息以类型的形式传递到异常处理模块;建立模块之间的异常通信机制,特别是在多层模块之间实现异常有序的传递,保证抛出的每个异常都能被适当的异常处理模块捕获。保证异常发生时能自动释放异常模块所占用的系统资源。对于不执行异常处理的代码没有任何额外的运行负担。将异常处理代码从普通代码中分离出来。1/15/20235第9章异常处理C++中的异常处理异常的抛出、检测和捕获异常在多层模块间的传递异常接口声明异常处理中析构函数的调用异常类的层次结构1/15/20236第9章异常处理异常的抛出、检测和捕获异常抛出、检测和捕获的语法定义如下:异常抛出:throw表达式;异常的检测和捕获由try-catch结构实现:try{被检测可能会发生异常的语句}catch(异常的类型){异常处理的语句}1/15/20237第9章异常处理intmain(){ floata,b,c; doublex1,x2;

cout<<"请输入一元二次方程的系数abc:";

cin>>a>>b>>c;

try{ if(0==a)throwa;//b并无意义,代表float型即可

if((b*b-4*a*c)<0)throw1.0; x1=(-b+sqrt(b*b-4*a*c))/2*b; x2=(-b-sqrt(b*b-4*a*c))/2*b;

cout<<"方程的实根是:x1="<<x1<<"x2="<<x2<<endl; }

catch(float) //捕获float类型的异常

{cout<<"系数b不能为0,方程无解!"<<endl;}

catch(double) //捕获double类型的异常

{cout<<"开方为负值,方程无解!"<<endl;}

cout<<"程序结束!"<<endl; return0;}1/15/20238第9章异常处理异常在多层模块间的传递【例】函数嵌套情况下的异常处理

typedef

structzero//声明除数为零异常类型 {strings;}ZERO;

typedef

structnegative//声明开方值为负异常类型 {strings;}NEGATIVE; fun2(inta,int

b,intc)//抛出异常的函数 { ZEROs1;NEGATIVEs2;s1.s="除数为零";s2.s="开方值为负数"; if(0==a)throws1;

if((b*b-4*a*c)<0)throws2; returnsqrt(b*b-4*a*c); }1/15/20239第9章异常处理fun1(inta,int

b,intc){//捕获异常并重新抛出异常 try {return(-b+fun2(a,b,c))/(2*a);}

catch(ZERO) {throw;//重新抛出异常}}intmain(){ floata,b,c;

cout<<"请输入一元二次方程的系数abc:";

cin>>a>>b>>c; try {cout<<"方程的一个实根是:x1="<<fun1(a,b,c)<<endl;}

catch(ZEROS1)//捕获除数为零异常,并处理异常

{cout<<S1.s<<",方程无解!"<<endl;}

catch(NEGATIVES2)//捕获开方值为负数异常,并处理异常

{cout<<S2.s<<",方程无解!"<<endl;}

cout<<"程序结束!"<<endl; return0;}1/15/202310第9章异常处理异常处理开始本模块中是否有try-catch结构进行异常处理是否有匹配的catch子句catch子句是否重新抛出异常异常处理结束是否有上级模块(调用栈是否为空)是否有匹配的catch子句进行异常正理终止程序运行否是是否是是否是否否1/15/202311第9章异常处理异常接口声明在使用可能抛出异常的函数时,可能需要知道该函数抛出的异常类型,C++专门提供了异常接口声明,也称为异常规范。其语法形式如下:函数类型函数名(函数参数表)throw(异常类型表)其中异常类型表包括该函数中所有可以抛出的异常类型,异常类型之间用逗号分开。异常接口声明是函数接口的一部分,是函数使用者和函数之间的协议。1/15/202312第9章异常处理异常处理中析构函数的调用#include<iostream>usingnamespacestd;voidFun(void);classintArray{public:

intArray(intn){ p=newint[n];

cout<<"构造intArray,分配具有”<<n<<“个元素的数组。"

<<endl; } ~intArray(){ delete[]p;

cout<<"析构intArray,释放资源。"<<endl; }private:

int*p;};1/15/202313第9章异常处理voidFun(){

intArrayia(10);

cout<<"在Fun()中抛掷整型异常。"<<endl;throw1;}intmain(){ try{

cout<<"在主函数的try块中调用函数Fun()。"<<endl; Fun(); } catch(int){

cout<<"在主函数catch子句捕获到整型异常,";

cout<<"并进行异常处理。"<<endl; }

cout<<"程序结束!"<<endl; return0;}1/15/202314第9章异常处理异常类的层次结构#include<iostream>#include<string>usingnamespacestd;classExcp{//声明异常基类public: staticvoidprint(stringmsg)//打印错误信息

{cout<<msg<<endl;}};classpushOnFull:publicExcp{//声明栈满异常类public:

pushOnFull(inti):tempvalue(i){}

int

getTempValue(){returntempvalue;}private:

int

tempvalue;//存放异常发生时没有压栈的值};1/15/202315第9章异常处理classpopOnEmpty:publicExcp{};//声明栈空异常类classnewError:publicExcp{};//声明动态分配内存异常类classotherError:publicExcp{};//声明其它异常类classStack{public: Stack(intcapacity=10)throw(newError);//建立一空栈 ~Stack(){delete[]elements;};//析构函数,释放数组资源

voidpush(intvalue)throw(pushOnFull);//压栈

voidpop(int&top_value)throw(popOnEmpty);//出栈

bool

isfull(){returntop<maxsize?false:true;};

bool

isempty(){returntop?false:true;};

intsize(){returntop;} voiddisplay();private:

inttop;//栈顶指针

int*elements;//存放栈中元素的栈数组

int

maxsize;//栈可容纳元素的个数};1/15/202316第9章异常处理Stack::Stack(intcapacity):top(0),maxsize(capacity){ elements=newint[capacity];//动态创建栈数组

if(0==elements)thrownewError();//如果分配失败抛出异常}voidStack::pop(int&top_value){ if(isempty())throwpopOnEmpty();//栈空,则抛出异常

top_value=elements[--top];}voidStack::push(intvalue){ if(isfull()) throwpushOnFull(value);//栈满抛出异常

elements[top++]=value;}voidStack::display(){ if(!size()) {cout<<"栈中已没有元素!\n";return;}

cout<<"(栈中有"<<size()<<"个元素)(bottom:"; for(inti=0;i<top;++i)

cout<<elements[i]<<"";

cout<<":top)\n";}1/15/202317第9章异常处理intmain(){

int

i,n,count; try{

cout<<"请输入需要栈的元素个数:";

cin>>n; StackmyStack(n);

cout<<"请输入压栈元素的个数:";

cin>>n; for(i=1;i<=n;count=++i)

myStack.push(i);

myStack.display();

cout<<"请输入出栈元素的个数:";

cin>>n; for(i=1;i<=n;count=i++) {intx;

myStack.pop(x); }

cout<<"已出栈"<<count<<"个元素!\n"; }1/15/202318第9章异常处理

catch(pushOnFulle){

e.print("栈已满!");

cout<<"栈中有"<<count-1<<"个元素,";

cout<<"值为"<<e.getTempValue()<<"的元素没有压入栈\n"; }

catch(newError) {newError::print("给栈分配空间时出错!");}

catch(popOnEmpty){

cout<<"已出栈"<<count<<"个元素,";

popOnEmpty::print("栈已空!"); }

catch(Excp) {Excp::print("程序其它异常在此处理!");} return0;}1/15/202319第9章异常处理标准异常C++标准库提供的标准异常类的层次结构

exceptionlogic_errorruntime_errorbad_allocbad_exceptionbad_castbad_typeidios_base::failurelength_errordomain_errorout_of_rangeinvalid::argumentrange_erroroverflow_errorunderflow::error1/15/202320第9章异常处理标准异常标准异常的根是exception类,其声明如下:namespacestd{//exception类在命名空间std中classexception{public: exception()throw();//缺省构造函数

exception(constexception&)throw();//拷贝构造函数

exception&operator=(constexception&)throw();

virtual~exception()throw();//析构函数

//what()返回一个字符串,用于异常的文本描述。

virtualconstchar*what()constthrow();};}1/15/202321第9章异常处理标准异常的使用#include<stdexcept>//标准异常的头文件#include<string>#include<iostream>usingnamespacestd;classArray{public:

Array(constchar*source,int

sz){ size=sz; ca=newchar[size]; for(inti=0;i<size;++i) if(!source)

ca[i]=0; else

ca[i]=source[i]; }1/15/202322第9章异常处理 char&operator[](inti)const{ if(i<0||i>=size){ stringes="数组越界!";

throwout_of_range(es);//将es字符串传入对象 } returnca[i]; }private:

intsize; char*ca;};1/15/202323第9章异常处理intmain(){ try{ charca[]={'A','B','C','D','E','F'}; ArrayCA(ca,sizeof(ca)/sizeof(char)); CA[5]='X';//正常访问字符数组类 CA[6]='G';//越界访问数组类将引发异常 return0; } catch(constout_of_range&excp){

cout<<excp.what()<<endl;//获取异常信息 return-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论