C++大学基础教程课件

PPT
  • 阅读 35 次
  • 下载 0 次
  • 页数 49 页
  • 大小 470.012 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
C++大学基础教程课件
可在后台配置第一页与第二页中间广告代码
C++大学基础教程课件
可在后台配置第二页与第三页中间广告代码
C++大学基础教程课件
可在后台配置第三页与第四页中间广告代码
C++大学基础教程课件
C++大学基础教程课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 49
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】C++大学基础教程课件.ppt,共(49)页,470.012 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44709.html

以下为本文档部分文字说明:

C++大学基础教程第13章异常处理程序设计的要求之一就是程序的健壮性。希望程序在运行时能够不出或者少出问题。但是,在程序的实际运行时,总会有一些因素会导致程序不能正常运行。异常处理(ExceptionHandling)就是

要提出或者是研究一种机制,能够较好的处理程序不能正常运行的问题。2022/11/243/45为什么强调异常处理电信系统的特点要求稳定,全年运行时间>99.999%用户数量巨大,使用频繁例:BBS系统程序:稳定>功能第十三章异常处理13.1异常和异常处理13.2C++异常

处理机制13.3用类的对象传递异常13.4异常处理中的退栈和对象析构2022/11/245/4513.1.1异常及其特点异常(Exceptions)是程序在运行时可能出现的会导致程序运行终止的错误。编译系统检查出来的语法错误,程序的逻辑错误,都不属于异常。异常是一个可以正确运行

的程序在运行中可能发生的错误。常见的异常,如:系统资源不足。如内存不足;磁盘空间不足等。用户操作错误导致运算关系不正确。如出现分母为0,数组越界等。2022/11/246/4513.1.2异常处理方法及举例对于程序中的异常,通常有三种处理的方法:不作处理。发布相应

的错误信息,然后,终止程序的运行。适当的处理异常,一般应该使程序可以继续运行。而在C++中,异常处理(ExceptionHandling)就是用try-throw-catch的模式进行异常处理的机制。2022/11/247/45例13.1程序将连续地输入两个实数,通

过调用函数,返回这两个数相除的商。并且要注意除数不能为0。#include<iostream.h>#include<stdlib.h>doubledivide(doublea,doubleb){if(b==0)//检测分母是不是为

0{cout<<"除数不可以等于0!"<<endl;abort();//调用abort函数终止运行}returna/b;}voidmain(){…调用divide…}用一般的方法处理程序异常2022/11/248/45如果

出现分母为0的情况,运行将出现以下结果:第十三章异常处理13.1异常和异常处理13.2C++异常处理机制13.3用类的对象传递异常13.4异常处理中的退栈和对象析构2022/11/2410/4513.2C++异常处理机制try{受保护语句;throw异常;其他语句

;}catch(异常类型){异常处理语句;}检测和抛掷异常扑获和处理异常try模块2022/11/2411/45voidf(){……throw异常……}main(){try{f();其他语句;}catch(异常类型){异常处理语句;}}2022/11/24

12/4513.2C++异常处理机制在C++中,将异常检测程序所抛掷(throw)的“带有异常信息的对象”称为“异常”。而将捕获异常的处理程序称为异常处理程序(ExceptionHandler)。2022/11

/2413/45例13.2用C++的异常处理机制,重新处理例13.1。#include<iostream>#include<stdlib.h>usingnamespacestd;doubledivide(doubl

ea,doubleb){if(b==0){throw"输入错误:除数不可以等于0!";}returna/b;}2022/11/2414/45voidmain(){doublex,y,z;cout<<"输入两个实数x和y:";while(cin>>x>>y){try{z=divi

de(x,y);}catch(constchar*s)//startofexceptionhandler{cout<<s<<"\n";cout<<"输入一对新的实数:";continue;}//endofhandlercou

t<<"x除以y等于"<<z<<"\n";cout<<"输入下一组数<q表示结束>:";}cout<<"程序结束,再见!\n";}2022/11/2415/4513.2C++异常处理机制程序运行的一种结果是:输入两个实数

x和y:1.23.2x除以y等于0.375输入下一组数<q表示结束>:3.40输入错误:除数不可以等于0!输入一对新的实数:2.34.5x除以y等于0.511111输入下一组数<q表示结束>:q程序结束,再见!2022/11/2416

/4513.2C++异常处理机制阅读这个程序,可以注意以下几点:在try的复合语句中,调用了函数divide。因此,尽管divide函数是在try模块的外面定义的,它仍然是属于try模块:在try语句块中运行;divide函数检测到异常后,抛掷出一个字符串

作为异常对象,异常的类型就是字符串类型;catch程序块指定的异常对象类型是char*,可以捕获字符串异常。捕获异常后的处理方式是通过continue语句,跳过本次循环,也不输出结果,直接进入下一次循环,要求用户再输入一对实数。202

2/11/2417/4513.2C++异常处理机制例13.2的执行过程可以简要的表示如下:第十三章异常处理13.1异常和异常处理13.2C++异常处理机制13.3用类的对象传递异常13.4异常处理中的退栈和对象析构2022/11/2419/

4513.3用类的对象传递异常throw语句所传递的异常,可以是各种类型的:整型、实型、字符型、指针,等等。也可以用类对象来传递异常。优势在于可以传递和处理异常有关的行为或者方法。专门用来传递异常的类称为异常类。异常类可以是用户自

定义的,也可以是系统提供的exception类。2022/11/2420/4513.3.1用户自定义类的对象传递异常我们用第十章中的栈类模板来作为例子,类模板中两个主要的函数push和pop的定义中,都安排了错误检查的语句,以检查栈空或者栈满的错误。由于

pop函数是有返回值的,在栈空的条件下,是没有数据可以出栈的。尽管pop函数可以检测到这种错误,但是,也不可能正常的返回,于是只好通过exit函数调用结束程序的执行。2022/11/2421/452.43.21

push(10.8)2.4push(2.4)2.43.21push(3.21)10.8push(1.2)pop()pop()pop()10.82.43.21pop()2022/11/2422/4513.3.1用户自定义类的对象传递异常现在,我们用C++异常处理的机制,改写这个程

序。可以定义两个异常类:“栈空异常”类在try块中,如果检测到“栈空异常”,就throw一个“StackEmptyException”类的对象“栈满异常”类。如果检测到“栈满异常”,就throw一个“StackOverflowException”类的对象。2022/11/2

423/45//例13.3:带有异常处理的栈#include<iostream>usingnamespacestd;classStackOverflowException//栈满异常类{public:St

ackOverflowException(){}~StackOverflowException(){}voidgetMessage(){cout<<"异常:栈满不能入栈。"<<endl;}};classStackEmpty

Exception//栈空异常类{public:StackEmptyException(){}~StackEmptyException(){}voidgetMessage(){cout<<"异常:栈空不能出栈。"<<endl

;}};2022/11/2424/45template<classT,inti>//类模板定义classMyStack{TStackBuffer[i];intsize;inttop;public:MyStack(void)

:size(i){top=i;};voidpush(constTitem);Tpop(void);};2022/11/2425/45template<classT,inti>//push成员函数定义voidMyStack<T

,i>::push(constTitem){if(top>0)StackBuffer[--top]=item;elsethrowStackOverflowException();//抛掷对象异常return;}2022/11/2426/45template<classT,inti>

//pop成员函数定义TMyStack<T,i>::pop(void){if(top<i)returnStackBuffer[top++];elsethrowStackEmptyException();//抛掷另一个对象异常}2022/11/2427/

45voidmain()//带有异常处理的类模板测试程序{MyStack<int,5>ss;for(inti=0;i<10;i++){try{if(i%3)cout<<ss.pop()<<endl;elsess.push(i);}ca

tch(StackOverflowException&e){e.getMessage();}catch(StackEmptyException&e){e.getMessage();}程序执行的结果是:0异常:栈空不能出栈。3异

常:栈空不能出栈。6异常:栈空不能出栈。Bye2022/11/2428/4513.3.1用户自定义类的对象传递异常这个例子和例13.2有一些明显不同的地方:通过对象传递参数。具体来说,是在throw语句中直接调用异常类的构造函

数,生成一个无名对象(如:throwStackEmptyException();),来传递异常的。在catch语句中规定的异常类型则是异常类对象的引用。当然,也可以直接用异常类对象作为异常。2022/11/2429/4513.3.1用户自定义类的对

象传递异常通过异常类对象的引用,直接调用异常类的成员函数getMessage,来处理异常。在try语句块后面直接有两个catch语句来捕获异常。也就是说,要处理的异常增加时,catch语句的数目也要增加。运行结果

表明,10次循环都已经完成。没有出现因为空栈时不能出栈而退出运行的情况。2022/11/2430/4513.3.2用exception类对象传递异常C++提供了一个专门用于传递异常的类:exception类。可以通过

exception类的对象来传递异常。classexception{public:exception();//默认构造函数exception(char*);//字符串作参数的构造函数exception(constexception&);exceptio

n&operator=(constexception&);virtual~exception();//虚析构函数virtualchar*what()const;//what()虚函数private:char*m_what;2022/11/2431/4

513.3.2用exception类对象传递异常其中和传递异常最直接有关的函数有两个:带参数的构造函数。参数是字符串,一般就是检测到异常后要显示的异常信息。what()函数。返回值就是构造exception类对象时所输入的字符串。可以直接用插入运算符“<<”

在显示器上显示。2022/11/2432/4513.3.2用exception类对象传递异常如果捕获到exception类对象后,只要显示关于异常的信息,则可以直接使用exception类。如果除了错误信息外,还需要显示其

他信息,或者作其他的操作,则可以定义一个exception类的派生类,在派生类中可以定义虚函数what的重载函数,以便增加新的信息的显示。2022/11/2433/4513.3.2用exception类对象传递异常例13.4定义一个简单的数组类。在数组类中重载“[]”运算符,目的是对于数组

元素的下标进行检测。如果发现数组元素下标越界,就抛掷一个对象来传递异常。并且要求处理异常时可以显示越界的下标值。2022/11/2434/4513.3.2用exception类对象传递异常我们使用exception类的对象来传递对象。但是,直接使用exception类对象还是

不能满足例题的要求。因为不能传递越界的下标值。为此,可以定义一个exception类的派生类ArrayOverflow。其中包含一个数据成员k。在构造ArrayOverflow类对象时,用越界的下标值初始化这个数据k。在catch块中捕获到这个对象

后,可以设法显示对象的k值。2022/11/2435/45//例13.4用exception类参与处理异常#include<iostream>#include<exception>usingnamespacest

d;classArrayOverflow:publicexception//exception类的派生类{public:ArrayOverflow::ArrayOverflow(inti):exception("数组越界异常!\n

"){k=i;}constchar*what()//重新定义的what()函数2022/11/2436/45classMyArray//数组类的定义{int*p;//数组首地址intsz;//数组大小

public:MyArray(ints){p=newint[s];sz=s;}//构造函数~MyArray(){delete[]p;}intsize(){returnsz;}int&opera

tor[](inti);//重载[]运算符的原型2022/11/2437/45voidf(MyArray&v);voidmain(){MyArrayA(10);f(A);}voidf(MyArray&v){//……for

(inti=0;i<3;i++){try{if(i!=1){v[i]=i;cout<<v[i]<<endl;}elsev[v.size()+10]=10;}th(AOfl&)程序运行后输出:0数组下标20越界数组越界异常!213.4异常处理中的退栈和对象析构2022/1

1/24北京邮电大学电信工程学院计算机技术中心39/4513.4异常处理中的退栈和对象析构在函数调用时,函数中定义的自动变量将在堆栈中存放。结束函数调用时,这些自动变量就会从堆栈中弹出,不再占用堆栈的空间,这个过程有时被称为“退栈”(Stackunwinding)。其他的结束动作还

包括调用析构函数,释放函数中定义的对象。2022/11/24北京邮电大学电信工程学院计算机技术中心40/4513.4异常处理中的退栈和对象析构但是,如果函数执行时出现异常,并且只是采用简单的显示异常信息,然后退出(exit)程序的做法,则程序的执行就会突然中断,结束函数调用时必须完

成的退栈和对象释放的操作也不会进行。这样的结果是很不希望的。2022/11/2441/45floatfunction3(intk)//function3中可能有异常{if(k==0){cout<<"function3中发生异常\n";//显示异常信

息exit(1);}//退出执行elsereturn123/k;}voidfunction2(intn){ForTestA12;function3(n);//第三次调用}2022/11/24北京邮电大学电信工程学院计算机技术中心42/4513

.4异常处理中的退栈和对象析构程序运行后显示:function3中发生异常在function1和fuction2中分别定义了ForTest类的对象。如果函数可以正常退出,这些对象将被释放。但是,程序运行后只显示了异常信息。没有析构函数被调用的迹象。说明所创建

的对象没有被释放。如果采用C++的异常处理机制来进行处理。情况就会完全不同。2022/11/24北京邮电大学电信工程学院计算机技术中心43/4513.4异常处理中的退栈和对象析构如果在function3中用throw语句来抛掷异常,就会开始function3的退栈。

然后,返回到函数function2开始function2的退栈,,并且调用ForTest类析构函数,释放对象A12。接着,返回到函数function1开始function1的退栈,,并且调用ForTest类析构函数,释放对象A11。2022/

11/2444/45例13.6用C++异常处理机制来重新编写例13.5。//例13.6:用C++异常处理机制,对象可以完全释放//Demonstratingstackunwinding.#includ

e<iostream>#include<stdlib.h>#include<exception>usingnamespacestd;classForTest{public:~ForTest()//析构函数{cout<<"ForTest类析构函数被

调用\n";}2022/11/2445/45floatfunction3(intk)//function3中可能有异常{if(k==0)throwexception("function3中出现异常\n");//抛掷异常类对象elsereturn123/k;}vo

idfunction2(intn){ForTestA12;function3(n);//第三次调用}voidfunction1(intm){ForTestA11;2022/11/2446/45voidmain(){try{function1(0);//第一次调用}catch(e

xception&error){cout<<error.what()<<endl;}}程序运行结果显示:ForTest类析构函数被调用ForTest类析构函数被调用function3中出现异常总结本章

介绍了C++异常处理的机制。在程序设计中使用这样的异常处理机制,有助于提高程序的健壮性、可读性。而且可以防止因为程序不正常结束而导致的资源泄漏,如创建的对象不能释放等。本章没有介绍多种异常处理的结构,而是希望读者能够抓住最基本的结构:try模块。另外一个重

要的内容就是通过用户自定义类的对象来传递异常。2022/11/2448/45作业2022/11/2449/45进度记录2006-4-28:22页

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?