C应用与开发案例教程下实用.pptx
《C应用与开发案例教程下实用.pptx》由会员分享,可在线阅读,更多相关《C应用与开发案例教程下实用.pptx(237页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 有时候,你可能面临并非所有的事情都是完美的事实,偶有时候,你可能面临并非所有的事情都是完美的事实,偶而,甚至最好的计划也会失败。不管怎么说,是人就会犯错。而,甚至最好的计划也会失败。不管怎么说,是人就会犯错。为了防范运行时的错误,为了防范运行时的错误,C+环境给予程序员试运行的机会,环境给予程序员试运行的机会,如果运行失败,它提供了一个预防机制。异常处理就是这种如果运行失败,它提供了一个预防机制。异常处理就是这种机制。机制。异常是发生在运行期间的诸如零作分母、数组的溢出以及异常是发生在运行期间的诸如零作分母、数组的溢出以及空闲空间的耗尽这样的错误事件。假如这些错误没有被捕获,空闲空间的耗尽这
2、样的错误事件。假如这些错误没有被捕获,则程序会突然地停止执行,而没有提供任何指示给使用者,则程序会突然地停止执行,而没有提供任何指示给使用者,告诉他发生了什么。处理这样的异常,不同的程序员有不同告诉他发生了什么。处理这样的异常,不同的程序员有不同的风格,这导致了代码的多样性。这种多样性随着用户自定的风格,这导致了代码的多样性。这种多样性随着用户自定义类的使用而增长,因为每一种这样的类都带有其潜在的特义类的使用而增长,因为每一种这样的类都带有其潜在的特定类的异常结构。定类的异常结构。当一个异常发生时,当一个异常发生时,C+以下列方式做出反应:以下列方式做出反应:1.发生异常的函数可以产生一个系统
3、定义的消息;发生异常的函数可以产生一个系统定义的消息;8.1概述第1页/共237页8.1概述2.函数可以完全终止执行;3.函数可以跳过中间层继续执行其他的部分。C+语言提供内建的对于意外情况处理的支持,这就是异常处理。通过C+语言的异常处理,你的程序能够使意外的事件与高层次的执行上下文进行通信,它能够从这种异常事件中恢复过来。C+处理异常的机制是灵活的,因此它能处理任何类型的异常。在C+中,产生一个异常被称为引发一个异常。第2页/共237页 8.2 何时使用异常处理 在程序运行期间调用一个函数会产生三种结果。它们是:在程序运行期间调用一个函数会产生三种结果。它们是:1.正常执行正常执行 在执行
4、过程中,函数正常地执行并返回到调用的程序中在执行过程中,函数正常地执行并返回到调用的程序中.一一些函数把结果代码返回给调用者。返回的代码表明执行的结些函数把结果代码返回给调用者。返回的代码表明执行的结果。果。2.错误执行错误执行 当调用者在变量传递过程中犯错或调用的函数超出上下文当调用者在变量传递过程中犯错或调用的函数超出上下文的范围时,会导致一个错误,这会终止程序的执行。的范围时,会导致一个错误,这会终止程序的执行。3.异常执行异常执行 在执行过程中出现异常的一种典型情况是内存不足;另一在执行过程中出现异常的一种典型情况是内存不足;另一种典型情况是一个种典型情况是一个I/O操作的异常。例如,
5、当打开一个存在操作的异常。例如,当打开一个存在的文件时,存储媒介的设备驱动器可能会出错。这种情况不的文件时,存储媒介的设备驱动器可能会出错。这种情况不能通过简单的查找文件是否存在来处理,引发并捕捉异常是能通过简单的查找文件是否存在来处理,引发并捕捉异常是最佳的处理方法。最佳的处理方法。第3页/共237页 8.2 何时使用异常处理 在开发需要照顾意外情形的应用程序时,异常处理是必需的。发生在程序执行时的意外情形有:运行内存不够、资源分配错误、不能找到/打开文件等。假如这些错误没有被捕获,那么,在没有给予用户任何有关发生什么情况的提示下,程序将被中断。异常可以被定义为在程序执行中意外情况的出现和正
6、常指令流的中断。第4页/共237页8.3 异常处理的基本语法 异常处理是C+的一个特征,它提供了处理运行期间异常的标准工具。一种一致性语法可以应用于这种目的,它能够被程序员很好的协调校正。一些常见的异常有分母为零、数组溢出以及NULL指针(即一个包含0值的指针)的引用。在C+语言中用try、throw和catch语句实现异常处理,在程序的某个函数中发现异常时使用throw表达式抛出这个异常,这个异常被抛给该函数的调用者,调用者用catch捕获该异常并进行相应的处理。当预测到某段程序将可能出现问题时,则该段程序放在try语句之后,使该段程序得以有机会抛出异常。第5页/共237页8.3.1 异常处
7、理的语法 异常处理的语法如下:throw 表达式语法:throw 表达式 try 表达式语法:try 受保护的程序段语句 catch(异常类型)异常处理语句;catch(异常类型)异常处理语句;其中,catch括号中异常类型与throw抛出的异常类型相匹配,当某个异常发生后,catch语句将逐个被检查,直到某个异常类型与throw抛出的异常类型相匹配,然后执行catch后面的第6页/共237页8.3.1 异常处理的语法异常处理程序。若catch括号中是省略号(),则该catch可以捕获所有的异常类型,所以这样的语句一般放在所有catch语句的最后一个,否则其他catch语句就没有机会捕捉相应的
8、错误类型了。当某个异常被捕捉并被相应的程序段处理后,系统将继续执行捕捉函数的其余部分。产生异常的函数和直到捕捉到异常的函数之间的所有调用链上的函数将从栈中删除。如果一个异常没有被任何函数捕捉到,则运行函数terminate将被调用,该函数的默认功能是调用abort函数终止程序的运行。一个异常处理的过程可以如下表示:void fun()int i;double f;第7页/共237页8.3.1 异常处理的语法 char c;/程序的其他部分 try /预期可能出现问题的地方,保护起来throwi;/如果出现问题1,抛出一个整数(只是假设)throwf;/如果出现问题2,抛出一个双精度数(只是假设
9、)throwc;/如果出现问题3,抛出一个字符(只是假设)catch(intii)/相应处理catch(doubleff)第8页/共237页8.3.1 异常处理的语法/相应处理catch(charcc)/相应处理/程序其他部分【例8-1】#includevoidmain()try第9页/共237页8.3.1 异常处理的语法intage;coutage;if(age100|age1)throwInvalidage!;coutAfterthethrowstatementendl;catch(char*msg)coutError!msgendl;coutAfterthecatchhandlerend
10、l;程序的输出结果为:第10页/共237页8.3.1 异常处理的语法 Enter the age::46After the throw statementAfter the catch handleEnter the age::116Error!Invalid age!After the catch handle第11页/共237页8.3.2 异常的类型 异常有两种类型:同步异常和异步异常。1.同步异常 发生在运行期间,并且能够使用throw表达式产生。仅有这种类型的异常能够使用C+中的异常处理器处理。控制不必返回异常引发处。2.异步异常 因为一个键盘或鼠标的中断而产生。C+程序不能使用try
11、和catch语句直接处理这种类型的异常。一次不得不产生一个自动调用与键盘或鼠标中断相关的例程。第12页/共237页8.4 Try、catch和throw语句 在在C+语语言言中中执执行行异异常常处处理理的的是是Try、catch和和 throw语语句句。通通过过C+的的异异常常处处理理,你你的的程程序序能能够够探探测测到到异异常常事事件件并并从从中中恢复过来。恢复过来。一个包含一个包含try、catch和和 throw语句的程序的执行过程如下:语句的程序的执行过程如下:1.控控制制通通过过正正常常的的连连续续执执行行到到达达try语语句句,在在try模模块块内内的的语语句句被被保护执行;保护执
12、行;2.如如果果在在被被保保护护的的执执行行期期间间没没有有异异常常被被引引发发,try模模块块之之后后的的catch语语句句不不会会执执行行。在在引引发发异异常常的的try模模块块后后面面的的最最后后的的catch语句之后继续执行;语句之后继续执行;3.如如果果在在被被保保护护的的执执行行过过程程中中有有一一个个异异常常被被引引发发,程程序序搜搜寻寻一一个能够处理被引发类型的异常的个能够处理被引发类型的异常的catch语句;语句;4.如如果果没没有有找找到到一一个个类类型型匹匹配配的的处处理理器器,那那么么调调用用预预定定义义的的运运行期间的函数行期间的函数terminate();第13页/
13、共237页8.4 Try、catch和throw语句5.如果找到了类型匹配的catch处理器,初始化它的参数并执行catch处理器中的指令。如果程序终止,释放堆栈中的所有值。一个基类的处理器也能够处理它的子类的异常。如果在catch表达式中遇到了一个“”,它将处理所有的异常而不管它们的数据类型。【例8-2】#includevoidmain()coutbeforethethrowstatementendl;trythrow25.6f;/引发一个浮点值第14页/共237页8.4 Try、catch和throw语句catch(char*str)coutCaughtastringendl;catch(
14、inti)coutCaughtanIntegerendl;catch(.)coutUnknowndatatypeendl;coutAfterthethrowstatementendl;第15页/共237页8.4 Try、catch和throw语句在上面的代码中,一个浮点值从try模块中被引发。然而,没有为接受一个浮点值而特意设计的catch处理器。因此程序的输出是:beforethethrowstatementUnkonwndatatypeAfterthethrowstatement新的运算符new引发了一个bad_alloc异常。新的头文件声明了bad_alloc类,它从异常类继承而来。Wh
15、at()函数在异常类中被声明。【例8-3】检查内存分配操作。#include#includevoidmain()第16页/共237页8.4 Try、catch和throw语句char*buff;trybuff=newchar1000000000;/声明在新的头文件中的新的运算符bad_alloc引发了一个类的对象catch(std:bad_alloc&obj)cout:obj.what()endl;该程序是关于一个try模块和与它相联系的catch处理器的第17页/共237页8.4 Try、catch和throw语句一个实例。该实例检查一个内存分配操作的错误,如果内存分配操作成功,则catch
16、处理器不执行。在一个内存分配错误的情况下,程序的输出是:Exceptionraised:bad_alloc如果在一个try模块执行过程中没有引发异常,在try模块后的catch语句不被执行。程序将在引发异常的try模块之后的最后一条catch语句继续执行。控制器只能够通过一个引发的异常来输入一个catch处理器,而不能通过一个switch语句中的一个case标号来进行。在前面提到的实例中,在try模块后仅存在一个catch处理器。然而,并不是一直这样的。也会存在其他的catch处理器。如果throw语句准备仅引发内建的数据类型(在这种情况下使用字符型),catch处理器的数量不能超过语言支持第
17、18页/共237页8.4 Try、catch和throw语句的内建数据类型的数量。为了解决这个问题,一个用户定义类型的不同的对象能够引发给处理器。如下例:【例8-4】#include#includeclassMyExceptionpublic:charcause21;MyException(char*in=0)strcpy(cause,in);第19页/共237页8.4 Try、catch和throw语句voidprintMessage()coutendlError:causeendl;classAclassintage;public:voidget()coutage;if(age100)第2
18、0页/共237页8.4 Try、catch和throw语句MyExceptione(Problemwithage);throwe;elsecoutCORRECTAGE!endl;voidmain()Aclassobject;第21页/共237页8.4 Try、catch和throw语句tryobject.get();catch(MyException&x)x.printMessage();【例8-5】异常的抛出和捕捉在同一函数中。#include#includeclassPerson第22页/共237页8.4 Try、catch和throw语句protected:charName20;/姓名i
19、ntOld;/年龄unsignedlongID;/身份证号charSex;/性别public:Person(char*theName,inttheOld,unsignedlongtheId,chartheSex);/类Person的构造函数;Person:Person(char*theName,inttheOld,unsignedlongtheId,chartheSex)if(Name=)/有效性检查第23页/共237页8.4 Try、catch和throw语句throwInvalidPersonsname!;if(Old200)/有效性检查throwOld;if(Sex!=M)&(Sex!=
20、m)&(Sex!=F)&(Sex!=f)/有效性检查throwSex;voidfun()trycoutfunline1endl;Personp1(zhang,43,1234566L,M);/类Person的对象p1coutfunline2endl;Personp2(,-1,22222222L,F);/类Person的对象p2coutfunline3endl;第24页/共237页8.4 Try、catch和throw语句Personp3(,-1,33333333L,M);/类Person的对象p3coutfunline4endl;Personp4(,-1,44444444L,F);/类Perso
21、n的对象p4catch(char)/捕捉错误并进行处理coutInvalidSex!endl;catch(int)/捕捉错误并进行处理coutInvalidOld!endl;catch(char*Msg)/捕捉错误并进行处理第25页/共237页8.4 Try、catch和throw语句coutInvalidName!endl;voidmain()coutbeforefun.endl;fun();coutendfun.endl;coutinthemainfunction!endl;在本程序中,异常的抛出和捕捉都在函数fun中,在实际应用中,异常的引发和处理一般在不同函数中,这样低层函数可以专注于
22、具体问题,上层调用函数可以在恰当的位置设计对不同类型第26页/共237页8.4 Try、catch和throw语句的异常进行各种处理而不考虑低层函数是如何产生这个异常的。【例8-6】对【例8-5】稍加改动,使异常的抛出和捕捉在不同函数中进行。【例8-6】异常的抛出和捕捉在不同函数中。#include#includeclassPersonprotected:charName20;/姓名intOld;/年龄unsignedlongID;/身份证号charSex;/性别第27页/共237页8.4 Try、catch和throw语句public:Person(char*theName,inttheOl
23、d,unsignedlongtheId,chartheSex);/类Person的构造函数;Person:Person(char*theName,inttheOld,unsignedlongtheId,chartheSex)if(Name=)/有效性检查throwInvalidPersonsname!;if(Old200)/有效性检查throwOld;if(Sex!=M)&(Sex!=m)&(Sex!=F)&(Sex!=f)/有效性检查第28页/共237页8.4 Try、catch和throw语句throwSex;voidfun()coutfunline1endl;Personp1(zhang
24、,43,1234566L,M);/类Person的对象p1coutfunline2endl;Personp2(,-1,22222222L,F);/类Person的对象p2coutfunline3endl;Personp3(,-1,33333333L,M);/类Person的对象p3coutfunline4endl;Personp4(,-1,44444444L,F);/类Person的对象p4第29页/共237页8.4 Try、catch和throw语句voidmain()trycout”beforefun”endl;fun();cout”endfun”endl;catch(char)/捕捉错误
25、并进行处理coutInvalidSex!endl;catch(int)/捕捉错误并进行处理第30页/共237页8.4 Try、catch和throw语句coutInvalidOld!endl;catch(char*Msg)/捕捉错误并进行处理coutInvalidName!endl;coutendl;coutinthemainfunction!endl;下面这个例子演示了如何用异常处理纠正程序运行期错误。【例8-7】纠正如下程序运行期错误。#include#includeclassString第31页/共237页8.4 Try、catch和throw语句private:char*str;pub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用 开发 案例 教程 实用
限制150内