C大学基础教程实用实用教案

上传人:hs****ma 文档编号:569870610 上传时间:2024-07-31 格式:PPT 页数:49 大小:1.02MB
返回 下载 相关 举报
C大学基础教程实用实用教案_第1页
第1页 / 共49页
C大学基础教程实用实用教案_第2页
第2页 / 共49页
C大学基础教程实用实用教案_第3页
第3页 / 共49页
C大学基础教程实用实用教案_第4页
第4页 / 共49页
C大学基础教程实用实用教案_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《C大学基础教程实用实用教案》由会员分享,可在线阅读,更多相关《C大学基础教程实用实用教案(49页珍藏版)》请在金锄头文库上搜索。

1、2024/7/311/45为什么强调异常(ychng)处理电信系统的特点要求稳定(wndng),全年运行时间99.999%用户数量巨大,使用频繁例:BBS系统程序:稳定(wndng)功能第1页/共48页第一页,共49页。第十三章异常(ychng)处理13.1异常和异常处理13.2C+异常处理机制13.3用类的对象(duxing)传递异常13.4异常处理中的退栈和对象(duxing)析构第2页/共48页第二页,共49页。2024/7/313/4513.1.1异常(ychng)及其特点异常(Exceptions)是程序在运行时可能出现的会导致程序运行终止的错误(cuw)。编译系统检查出来的语法错误

2、(cuw),程序的逻辑错误(cuw),都不属于异常。异常是一个可以正确运行的程序在运行中可能发生的错误(cuw)。常见的异常,如:系统资源不足。如内存不足;磁盘空间不足等。用户操作错误(cuw)导致运算关系不正确。如出现分母为0,数组越界等。第3页/共48页第三页,共49页。2024/7/314/4513.1.2异常(ychng)处理方法及举例对于程序中的异常,通常有三种处理的方法:不作处理。发布相应的错误信息,然后,终止程序的运行。适当的处理异常,一般应该使程序可以继续运行。而在C+中,异常处理(ExceptionHandling)就是用trythrowcatch的模式进行( jnxng)异

3、常处理的机制。第4页/共48页第四页,共49页。2024/7/315/45例13.1程序将连续地输入两个实数,通过调用函数(hnsh),返回这两个数相除的商。并且要注意除数不能为0。#include#includedoubledivide(doublea,doubleb)if(b=0)/检测分母是不是为0cout除数不可以等于0!endl;abort();/调用abort函数(hnsh)终止运行returna/b;voidmain()调用divide用一般的方法(fngf)处理程序异常第5页/共48页第五页,共49页。2024/7/316/45如果(rgu)出现分母为0的情况,运行将出现以下结

4、果:第6页/共48页第六页,共49页。第十三章异常(ychng)处理13.1异常(ychng)和异常(ychng)处理13.2C+异常(ychng)处理机制13.3用类的对象传递异常(ychng)13.4异常(ychng)处理中的退栈和对象析构第7页/共48页第七页,共49页。2024/7/318/4513.2C+异常处理(chl)机制try受保护语句;throw异常(ychng);其他语句;catch(异常(ychng)类型)异常(ychng)处理语句;检测和抛掷检测和抛掷(pozh)异常异常扑获和处理异扑获和处理异常常try模块模块第8页/共48页第八页,共49页。2024/7/319/4

5、5voidf()throw异常main()tryf();其他语句(yj);catch(异常类型)异常处理语句(yj);第9页/共48页第九页,共49页。2024/7/31104513.2C+异常处理(chl)机制在C+中,将异常检测程序所抛掷(throw)的“带有异常信息(xnx)的对象”称为“异常”。而将捕获异常的处理程序称为异常处理程序(ExceptionHandler)。第10页/共48页第十页,共49页。2024/7/311145例13.2用C+的异常处理机制,重新处理例13.1。#include#includeusingnamespacestd;doubledivide(double

6、a,doubleb)if(b=0)throw输入(shr)错误:除数不可以等于0!;returna/b;第11页/共48页第十一页,共49页。2024/7/311245voidmain()doublex,y,z;coutxy) tryz=divide(x,y); catch(constchar*s)/startofexceptionhandlercoutsn;cout输入一对新的实数:;continue;/endofhandlercoutx除以y等于zn;cout输入下一组数:;cout程序结束,再见!n;第12页/共48页第十二页,共49页。2024/7/31134513.2C+异常(ych

7、ng)处理机制程序运行的一种结果是:输入两个(lin)实数x和y:1.23.2x除以y等于0.375输入下一组数:3.40输入错误:除数不可以等于0!输入一对新的实数:2.34.5x除以y等于0.511111输入下一组数:q程序结束,再见!第13页/共48页第十三页,共49页。2024/7/31144513.2C+异常(ychng)处理机制阅读这个程序,可以注意以下几点:在try的复合语句中,调用了函数divide。因此,尽管divide函数是在try模块的外面定义的,它仍然是属于try模块:在try语句块中运行;divide函数检测到异常后,抛掷出一个字符串作为异常对象(duxing),异常

8、的类型就是字符串类型;catch程序块指定的异常对象(duxing)类型是char*,可以捕获字符串异常。捕获异常后的处理方式是通过continue语句,跳过本次循环,也不输出结果,直接进入下一次循环,要求用户再输入一对实数。第14页/共48页第十四页,共49页。2024/7/31154513.2C+异常处理(chl)机制例13.2的执行过程(guchng)可以简要的表示如下:第15页/共48页第十五页,共49页。第十三章异常(ychng)处理13.1异常(ychng)和异常(ychng)处理13.2C+异常(ychng)处理机制13.3用类的对象传递异常(ychng)13.4异常(ychng

9、)处理中的退栈和对象析构第16页/共48页第十六页,共49页。2024/7/31174513.3用类的对象(duxing)传递异常throw语句所传递的异常,可以是各种类型的:整型、实型、字符型、指针,等等(dndn)。也可以用类对象来传递异常。优势在于可以传递和处理异常有关的行为或者方法。专门用来传递异常的类称为异常类。异常类可以是用户自定义的,也可以是系统提供的exception类。第17页/共48页第十七页,共49页。2024/7/31184513.3.1用户自定义类的对象传递(chund)异常我们用第十章中的栈类模板来作为例子,类模板中两个主要的函数push和pop的定义中,都安排了错

10、误检查的语句,以检查栈空或者栈满的错误。由于pop函数是有返回值的,在栈空的条件下,是没有数据可以(ky)出栈的。尽管pop函数可以(ky)检测到这种错误,但是,也不可能正常的返回,于是只好通过exit函数调用结束程序的执行。第18页/共48页第十八页,共49页。2024/7/3119452.43.21push(10.8)2.4push(2.4)2.43.21push(3.21)10.8push(1.2)pop()pop()pop()10.82.43.21pop()第19页/共48页第十九页,共49页。2024/7/31204513.3.1用户自定义类的对象(duxing)传递异常现在,我们用

11、C+异常处理(chl)的机制,改写这个程序。可以定义两个异常类:“栈空异常”类在try块中,如果检测到“栈空异常”,就throw一个“StackEmptyException”类的对象“栈满异常”类。如果检测到“栈满异常”,就throw一个“StackOverflowException”类的对象。第20页/共48页第二十页,共49页。2024/7/312145/例13.3:带有异常(ychng)处理的栈#includeusingnamespacestd;classStackOverflowException/栈满异常(ychng)类public:StackOverflowException()S

12、tackOverflowException()voidgetMessage()cout异常(ychng):栈满不能入栈。endl;classStackEmptyException/栈空异常(ychng)类public:StackEmptyException()StackEmptyException()voidgetMessage()cout异常(ychng):栈空不能出栈。endl;第21页/共48页第二十一页,共49页。2024/7/312245template/类模板(mbn)定义classMyStackTStackBufferi;intsize;inttop;public:MyStack

13、(void):size(i)top=i;voidpush(constTitem);Tpop(void);第22页/共48页第二十二页,共49页。2024/7/312345template/push成员函数定义voidMyStack:push(constTitem)if(top0)StackBuffer-top=item;elsethrowStackOverflowException();/抛掷(pozh)对象异常return;第23页/共48页第二十三页,共49页。2024/7/312445template/pop成员函数定义TMyStack:pop(void)if(topi)returnSt

14、ackBuffertop+;elsethrowStackEmptyException();/抛掷(pozh)另一个对象异常第24页/共48页第二十四页,共49页。2024/7/312545voidmain()/带有异常处理(chl)的类模板测试程序MyStackss;for(inti=0;i10;i+)tryif(i%3)coutss.pop()endl;elsess.push(i);catch(StackOverflowException&e)e.getMessage();catch(StackEmptyException&e)e.getMessage();coutByen;程序执行的结果程

15、序执行的结果(ji gu)(ji gu)是:是:0 0异常:栈空不能出栈。异常:栈空不能出栈。3 3异常:栈空不能出栈。异常:栈空不能出栈。6 6异常:栈空不能出栈。异常:栈空不能出栈。ByeBye第25页/共48页第二十五页,共49页。2024/7/31264513.3.1用户自定义类的对象传递(chund)异常这个例子和例13.2有一些明显不同的地方:通过(tnggu)对象传递参数。具体来说,是在throw语句中直接调用异常类的构造函数,生成一个无名对象(如:throwStackEmptyException();),来传递异常的。在catch语句中规定的异常类型则是异常类对象的引用。当然,

16、也可以直接用异常类对象作为异常。第26页/共48页第二十六页,共49页。2024/7/31274513.3.1用户自定义类的对象传递(chund)异常通过异常类对象的引用,直接调用异常类的成员函数getMessage,来处理异常。在try语句(yj)块后面直接有两个catch语句(yj)来捕获异常。也就是说,要处理的异常增加时,catch语句(yj)的数目也要增加。运行结果表明,10次循环都已经完成。没有出现因为空栈时不能出栈而退出运行的情况。第27页/共48页第二十七页,共49页。2024/7/31284513.3.2用exception类对象传递(chund)异常C+提供了一个专门(zhu

17、nmn)用于传递异常的类:exception类。可以通过exception类的对象来传递异常。classexceptionpublic:exception();/默认构造函数exception(char*); /字符串作参数的构造函数exception(constexception&);exception&operator=(constexception&);virtualexception();/虚析构函数virtualchar*what()const;/what()虚函数private:char*m_what;第28页/共48页第二十八页,共49页。2024/7/31294513.3.2用

18、exception类对象(duxing)传递异常其中和传递异常(ychng)最直接有关的函数有两个:带参数的构造函数。参数是字符串,一般就是检测到异常(ychng)后要显示的异常(ychng)信息。what()函数。返回值就是构造exception类对象时所输入的字符串。可以直接用插入运算符“”在显示器上显示。第29页/共48页第二十九页,共49页。2024/7/31304513.3.2用exception类对象(duxing)传递异常如果捕获到exception类对象后,只要显示关于异常的信息,则可以(ky)直接使用exception类。如果除了错误信息外,还需要显示其他信息,或者作其他的操

19、作,则可以(ky)定义一个exception类的派生类,在派生类中可以(ky)定义虚函数what的重载函数,以便增加新的信息的显示。第30页/共48页第三十页,共49页。2024/7/31314513.3.2用exception类对象(duxing)传递异常例13.4定义一个简单的数组类。在数组类中重载“”运算符,目的是对于数组元素的下标(xibio)进行检测。如果发现数组元素下标(xibio)越界,就抛掷一个对象来传递异常。并且要求处理异常时可以显示越界的下标(xibio)值。第31页/共48页第三十一页,共49页。2024/7/31324513.3.2用exception类对象(duxin

20、g)传递异常我们使用exception类的对象来传递对象。但是,直接使用exception类对象还是不能满足例题的要求。因为不能传递越界的下标值。为此,可以定义一个(y)exception类的派生类ArrayOverflow。其中包含一个(y)数据成员k。在构造ArrayOverflow类对象时,用越界的下标值初始化这个数据k。在catch块中捕获到这个对象后,可以设法显示对象的k值。第32页/共48页第三十二页,共49页。2024/7/313345/例13.4用exception类参与处理异常#include#includeusingnamespacestd;classArrayOverfl

21、ow:publicexception/exception类的派生类public:ArrayOverflow:ArrayOverflow(inti):exception(数组越界异常!n)k=i;constchar*what()/重新定义(dngy)的what()函数cout数组下标k=0&isz)returnpi;throwArrayOverflow(i);第34页/共48页第三十四页,共49页。2024/7/313545voidf(MyArray&v);voidmain()MyArrayA(10);f(A);voidf(MyArray&v)/for(inti=0;i3;i+)tryif(i!

22、=1)vi=i;coutviendl;elsevv.size()+10=10;catch(ArrayOverflow&r)coutr.what();/for循环(xnhun)结束程序运行后输出程序运行后输出(shch)(shch):0 0数组下标数组下标2020越界越界数组越界异常数组越界异常! !2 2第35页/共48页第三十五页,共49页。13.4 13.4 异常异常(ychng)(ychng)处理处理中的退栈中的退栈 和对象析和对象析构构 第36页/共48页第三十六页,共49页。2024/7/31374513.4异常(ychng)处理中的退栈和对象析构在函数调用时,函数中定义的自动变量将

23、在堆栈中存放。结束函数调用时,这些自动变量就会从堆栈中弹出,不再占用堆栈的空间,这个过程有时被称为“退栈”(Stackunwinding)。其他的结束动作(dngzu)还包括调用析构函数,释放函数中定义的对象。第37页/共48页第三十七页,共49页。2024/7/31384513.4异常处理(chl)中的退栈和对象析构但是,如果函数执行时出现异常,并且只是采用简单的显示异常信息,然后退出(exit)程序的做法,则程序的执行就会突然中断,结束函数调用时必须(bx)完成的退栈和对象释放的操作也不会进行。这样的结果是很不希望的。第38页/共48页第三十八页,共49页。2024/7/313945flo

24、atfunction3(intk)/function3中可能有异常if(k=0)coutfunction3中发生(fshng)异常n;/显示异常信息exit(1);/退出执行elsereturn123/k;voidfunction2(intn)ForTestA12;function3(n);/第三次调用voidfunction1(intm)ForTestA11;function2(m);/第二次调用voidmain()function1(0);/第一次调用第39页/共48页第三十九页,共49页。2024/7/31404513.4异常(ychng)处理中的退栈和对象析构程序运行后显示:funct

25、ion3中发生异常在function1和fuction2中分别定义了ForTest类的对象。如果函数可以正常退出,这些对象将被释放。但是,程序运行后只显示了异常信息。没有析构函数被调用的迹象。说明所创建(chungjin)的对象没有被释放。如果采用C+的异常处理机制来进行处理。情况就会完全不同。第40页/共48页第四十页,共49页。2024/7/31414513.4异常处理(chl)中的退栈和对象析构如果在function3中用throw语句来抛掷异常(ychng),就会开始function3的退栈。然后,返回到函数function2开始function2的退栈,并且调用ForTest类析构函

26、数,释放对象A12。接着,返回到函数function1开始function1的退栈,并且调用ForTest类析构函数,释放对象A11。第41页/共48页第四十一页,共49页。2024/7/314245例13.6用C+异常处理机制来重新编写例13.5。/例13.6:用C+异常处理机制,对象可以完全(wnqun)释放/Demonstratingstackunwinding.#include#include#includeusingnamespacestd;classForTestpublic:ForTest() /析构函数coutForTest类析构函数被调用n;/ForTest类定义结束第42页

27、/共48页第四十二页,共49页。2024/7/314345floatfunction3(intk)/function3中可能有异常if(k=0)throwexception(function3中出现异常n);/抛掷(pozh)异常类对象elsereturn123/k;voidfunction2(intn)ForTestA12;function3(n);/第三次调用voidfunction1(intm)ForTestA11;function2(m);/第二次调用第43页/共48页第四十三页,共49页。2024/7/314445voidmain()tryfunction1(0);/第一次调用(di

28、oyng)catch(exception&error)couterror.what()endl;程序运行结果显示:ForTest类析构函数被调用(dioyng)ForTest类析构函数被调用(dioyng)function3中出现异常第44页/共48页第四十四页,共49页。总结(zngji)本章介绍了C+异常处理的机制。在程序设计中使用这样的异常处理机制,有助于提高程序的健壮性、可读性。而且可以防止因为程序不正常结束而导致的资源泄漏,如创建的对象不能释放等。本章没有介绍多种异常处理的结构,而是希望(xwng)读者能够抓住最基本的结构:try模块。另外一个重要的内容就是通过用户自定义类的对象来传

29、递异常。第45页/共48页第四十五页,共49页。2024/7/314645作业(zuy)第46页/共48页第四十六页,共49页。2024/7/314745进度(jnd)记录2006-4-28:22页第47页/共48页第四十七页,共49页。2024/7/3148/45感谢您的欣赏(xnshng)!第48页/共48页第四十八页,共49页。内容(nirng)总结2021/11/10。如果出现分母为0 的情况,运行将出现以下结果:。第10页/共48页。例13.2 用C+的异常处理机制,重新处理例13.1。double x,y,z。如果检测到“栈满异常”,就throw一个“StackOverflowException”类的对象。在数组类中重载“ ”运算符,目的是对于(duy)数组元素的下标进行检测。例13.6 用C+异常处理机制来重新编写例13.5。第47页/共48页第四十九页,共49页。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号