第15章异常处理精.ppt

上传人:石*** 文档编号:50878281 上传时间:2022-10-16 格式:PPT 页数:32 大小:1.61MB
返回 下载 相关 举报
第15章异常处理精.ppt_第1页
第1页 / 共32页
第15章异常处理精.ppt_第2页
第2页 / 共32页
点击查看更多>>
资源描述

《第15章异常处理精.ppt》由会员分享,可在线阅读,更多相关《第15章异常处理精.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第第第1515章异常处理章异常处理章异常处理章异常处理第1页,本讲稿共32页错误类型:错误类型:-语法错误语法错误 -逻辑错误逻辑错误 -运行错误运行错误一般情况下,不会出错,但在一些特殊情况下,就不能正确运行。异常第2页,本讲稿共32页异常处理异常处理传统错误处理方法传统错误处理方法异常处理机制异常处理机制抛出异常抛出异常捕获异常和处理异常捕获异常和处理异常异常规格说明异常规格说明第3页,本讲稿共32页程序逻辑经常对决定程序下一步怎样执行的条件进行测试程序逻辑经常对决定程序下一步怎样执行的条件进行测试执行一个任务执行一个任务如果这个任务没有正确执行如果这个任务没有正确执行 则执行错误处理则

2、执行错误处理执行下一个任务执行下一个任务如果该任务没有正确执行如果该任务没有正确执行 则执行错误处理则执行错误处理int main()ifstream inCredit(credit.dat);if(!inCredit)cerr File could not be opened.endl;exit(1);int fun(int a,int b)if(b=0)cerr “cant be divided by zero.endl;exit(1);第4页,本讲稿共32页传统错误处理方法传统错误处理方法可以处理的错误在发生错误的地方可以处理的错误在发生错误的地方就地处理就地处理在检查到一个在局部无法处

3、理的问题时,一个函数可以:在检查到一个在局部无法处理的问题时,一个函数可以:终止程序终止程序 abort()/exit()返回一个表示返回一个表示“错误错误”的值。的值。int调用一个预先准备好在出现调用一个预先准备好在出现“错误错误”的情况下用的函数。的情况下用的函数。第5页,本讲稿共32页处理错误的传统方法处理错误的传统方法处理错误的传统方法:错误处理代码是在整个系统代码中分布的。代码中可能出错的地处理错误的传统方法:错误处理代码是在整个系统代码中分布的。代码中可能出错的地方都要方都要当场进行当场进行错误处理。在写程序时,必须知道所有的错误该如何处理错误处理。在写程序时,必须知道所有的错误

4、该如何处理好处好处:程序员阅读代码时能够程序员阅读代码时能够直接直接看到错误处理情况,确定是否实现了正确的看到错误处理情况,确定是否实现了正确的错误检查。错误检查。问题问题:代码中受到错误处理的代码中受到错误处理的“污染污染”,使应用程序本身的代码更加晦涩难懂,难,使应用程序本身的代码更加晦涩难懂,难以看出代码功能是否正确实现。这样就使代码的以看出代码功能是否正确实现。这样就使代码的理解和维护更加困难理解和维护更加困难。第6页,本讲稿共32页面向对象中的异常处理面向对象中的异常处理面向对象中,程序员经常做的是一些工具(类的设计面向对象中,程序员经常做的是一些工具(类的设计与实现)与实现)这些工

5、具能够检测出错误,但往往不知道该如何处理这些工具能够检测出错误,但往往不知道该如何处理错误。错误的处理是由工具的使用者决定错误。错误的处理是由工具的使用者决定第7页,本讲稿共32页异常处理异常处理C+的新异常处理特性:的新异常处理特性:异常处理将异常处理将检测发现检测发现错误的代码与错误的代码与处理处理错误的代码分开来。程序员的错误的代码分开来。程序员的工作也可做相应分工(例如,库函数程序员负责检测异常,而调用工作也可做相应分工(例如,库函数程序员负责检测异常,而调用库函数的另一程序员则负责捕获与处理异常)。库函数的另一程序员则负责捕获与处理异常)。使程序员可以删除程序执行使程序员可以删除程序

6、执行“主线条主线条”中的错误处理代码,从而提高程序中的错误处理代码,从而提高程序的可读性和可维护性。的可读性和可维护性。需要一种需要一种机制机制能将检测到的错误告诉使用者能将检测到的错误告诉使用者第8页,本讲稿共32页异常处理异常处理传统错误处理方法传统错误处理方法异常处理机制异常处理机制抛出异常抛出异常捕获异常和处理异常捕获异常和处理异常异常规格说明异常规格说明第9页,本讲稿共32页C+异常处理机制异常处理机制如果某段程序可能会抛出异常,则必须通知系统启动异常处理机制。如果某段程序可能会抛出异常,则必须通知系统启动异常处理机制。即通过即通过try语句块实现。语句块实现。异常处理代码的一般形式

7、:异常处理代码的一般形式:try可能抛出异常的代码可能抛出异常的代码(throw)catch(类型类型1 参数参数1)处理该异常的代码处理该异常的代码catch(类型类型2 参数参数2)处理该异常的代码处理该异常的代码Try语句块中包含了可能抛出异常的代码,一旦抛出了异常,则退出try语句块,进入try后面的异常捕获和处理第10页,本讲稿共32页异常处理异常处理传统错误处理方法传统错误处理方法异常处理机制异常处理机制抛出(异常对象)抛出(异常对象)捕获(异常对象)捕获(异常对象)处理异常处理异常异常规格说明异常规格说明第11页,本讲稿共32页抛出异常抛出异常如果程序发生异常情况,而在当前的环境

8、中获取不到异常处理的足够信如果程序发生异常情况,而在当前的环境中获取不到异常处理的足够信息,我们可以息,我们可以创建一包含出错信息的对象创建一包含出错信息的对象并将该对象抛出当前环境,发送给并将该对象抛出当前环境,发送给更大的环境中。这称为异常抛出。更大的环境中。这称为异常抛出。例例1throw myerror(“something bad happened”);myerror是一个类,它以字符串变量为参数是一个类,它以字符串变量为参数例例2 throw int(5)int是一个内部类型,是一个内部类型,5是一个是一个int类型的常数类型的常数 第12页,本讲稿共32页throw与其操作数与其

9、操作数抛出异常的语句形式:抛出异常的语句形式:throw ;throw通常指定一个操作数(或不指定操作数的特殊情况)。通常指定一个操作数(或不指定操作数的特殊情况)。throw的操作数可以的操作数可以是任何类型,如果操作数是个对象,则称为异常对象。也可以抛出条件表达式而不是任何类型,如果操作数是个对象,则称为异常对象。也可以抛出条件表达式而不是抛出对象,可以抛出不用于错误处理的对象。是抛出对象,可以抛出不用于错误处理的对象。抛出异常时,生成和初始化抛出异常时,生成和初始化throw操作数的一个临时副本,然后这个临时对象初始化异操作数的一个临时副本,然后这个临时对象初始化异常处理器中的参数。异常

10、处理器执行完毕和退出时,删除临时对象。常处理器中的参数。异常处理器执行完毕和退出时,删除临时对象。第13页,本讲稿共32页异常抛出实例:异常抛出实例:定义一个除法函数,当除数为定义一个除法函数,当除数为0时,抛出一个用户定义的时,抛出一个用户定义的异异常类对象常类对象,该对象能告诉用户发生了除零错误。,该对象能告诉用户发生了除零错误。第14页,本讲稿共32页异常抛出实例异常抛出实例 异常类定义异常类定义/Class DivideByZeroException to be used in exception/handling for throwing an exception on a divi

11、sion by zero.class DivideByZeroException private:const char*message;public:DivideByZeroException():message(attempted to divide by zero)const char*what()const return message;记录出现的异常情况Message的默认值告诉用户出现了什么异常第15页,本讲稿共32页异常抛出实例异常抛出实例 异常抛出异常抛出double Div(int x,int y)if(y=0)throw DivideByZeroException();ret

12、urn static_cast(x)/y;这条语句用默认构造函数生成了一个DivedeByZeroException类的对象,并把这个对象返回给调用它的函数,div函数执行结束第16页,本讲稿共32页异常处理异常处理传统错误处理方法传统错误处理方法异常处理机制异常处理机制抛出异常抛出异常捕获异常捕获异常处理异常处理异常异常规格说明异常规格说明第17页,本讲稿共32页异常捕获异常捕获 一个函数抛出异常,它必须假定该异常能被捕获和一个函数抛出异常,它必须假定该异常能被捕获和处理。异常捕获机制使得处理。异常捕获机制使得C+可以把问题集中在一可以把问题集中在一处解决。处解决。如果某段程序可能会抛出异常

13、,则必须通知系统启如果某段程序可能会抛出异常,则必须通知系统启动异常处理机制。(动异常处理机制。(try语句块)语句块)第18页,本讲稿共32页catch捕获异常捕获异常异常处理器放在异常处理器放在catch块中块中,形式如下:形式如下:catch()catch处理器定义自己的范围。处理器定义自己的范围。catch在括号中指定在括号中指定要捕获的对象类型要捕获的对象类型。catch处理器中的处理器中的参数可以命名也可以无名。如果是命名参数,则可以在处理器中引用这个参数。如果是无名参数可以命名也可以无名。如果是命名参数,则可以在处理器中引用这个参数。如果是无名参数参数(只指定匹配抛出对象类型的类

14、型只指定匹配抛出对象类型的类型),则信息不从抛出点传递到处理器中,只是控制从抛,则信息不从抛出点传递到处理器中,只是控制从抛出点转到处理器中许多异常都可以这样。出点转到处理器中许多异常都可以这样。catch()捕获任意类型的异常。捕获任意类型的异常。第19页,本讲稿共32页异常捕获原理异常捕获原理如果一个异常信号被抛出,异常处理器中第一个参数与异常抛出对象相匹配的如果一个异常信号被抛出,异常处理器中第一个参数与异常抛出对象相匹配的函数将捕获该异常信号,然后进入相应的函数将捕获该异常信号,然后进入相应的catch语句,执行异常处理程序。处理语句,执行异常处理程序。处理完后转到所有完后转到所有ca

15、tch后的语句继续执行后的语句继续执行如果找遍了所有如果找遍了所有catch处理器都不匹配,则函数执行结束,并将该异常抛给调用它的函数,处理器都不匹配,则函数执行结束,并将该异常抛给调用它的函数,由调用他的函数来处理该程序。由调用他的函数来处理该程序。第20页,本讲稿共32页除零异常的捕获除零异常的捕获int main()int number1,number2;double result;cout number1 number2)try result=Div(number1,number2);cout The quotient is:result endl;catch(DivideByZero

16、Exception ex)cout Exception occurred:ex.what()n;cout nEnter two integers(end-of-file to end):“;cout endl;return 0;Try语句块中包含了可能抛出异常的代码Div,一旦抛出了异常,则退出try语句块,进入try后面的异常捕获和处理double Div(int x,int y)if(y=0)throw DivideByZeroException();return static_cast(x)/y;第21页,本讲稿共32页int main()int number1,number2;doub

17、le result;cout number1 number2)try if(number2=0)throw DivideByZeroException();result=static_cast(number1)/number2;cout The quotient is:result endl;catch(DivideByZeroException ex)cout Exception occurred:ex.what()n;cout nEnter two integers(end-of-file to end):;cout endl;return 0;该程序实行了什么功能?第22页,本讲稿共32

18、页输出结果输出结果Enter tow integers(end-of-file to end);l00 7The quotient is:14.2857Enter tow integers(end-of-file to end);100 0Exception occurred:attempted to divide by zeroEnter tow integers(end-of-file to end);33 9The quotient is:3.66667Enter tow integers end-of-file to end):第23页,本讲稿共32页异常抛出与检测实例二异常抛出与检测

19、实例二int Div(int x,int y)if(y=0)throw y;return x/y;抛出的异常不一定是对象,可以是一个结果为内置类型的表达式第24页,本讲稿共32页int main()try cout Div(6,3)endl;cout Div(10,0)endl;cout Div(5,2)endl;catch(int)cout divide by zero endl;cout Its Over endl;return 0;2divide by zeroIts Overint Div(int x,int y)if(y=0)throw y;return x/y;第25页,本讲稿共3

20、2页 C+提供了标准异常处理类库,它用来抛出C+标准库中函数执行时的异常。C+标准异常处理类的层次结构图如下图所示:标准异常类 第26页,本讲稿共32页调用一个函数时可能会收到一个异常。调用一个函数时可能会收到一个异常。如何知道是否会收到异常呢?如何知道是否会收到异常呢?收到的是什么异常?收到的是什么异常?异常规格声明第27页,本讲稿共32页异常处理异常处理传统错误处理方法传统错误处理方法异常处理机制异常处理机制抛出异常抛出异常捕获异常和处理异常捕获异常和处理异常异常规格说明异常规格说明第28页,本讲稿共32页异常规格说明异常规格说明传统函数声明:返回类型传统函数声明:返回类型 函数名函数名(

21、形式参数表形式参数表);函数可以抛出任何异常。函数可以抛出任何异常。通常我们希望在调用函数时,知道该函数会抛出什么样的异常。所以允许在通常我们希望在调用函数时,知道该函数会抛出什么样的异常。所以允许在函数原型声明中指出函数原型声明中指出void f()throw(toobig,toosmall,divzero);函数会抛出函数会抛出toobig,toosmall,divzero三种异常三种异常void f()throw();函数不会有异常抛出。函数不会有异常抛出。第29页,本讲稿共32页#include using namespace std;class up;class down;void

22、f(int i)throw(up,down);int main()for(int i=1;i=3;+i)try f(i);catch(up)cout up catched endl;catch(down)cout down catched endl;return 0;void f(int i)throw(up,down)switch(i)case 1:throw up();case 2:throw down();up catcheddown catched第30页,本讲稿共32页void CheckingAccount:credit(double money)try double temp=0

23、.0;temp=getBalance()+money-trade;if(temp 0)throw 0;else temp=money-trade;addBalance(temp);cout 成功向账户:getAccountName()中存储 money 元,手续费为 trade 元endl;catch(int)cerr“Error:账户余额不足以支付手续费,请重新输入存款金额!);exit(0);第31页,本讲稿共32页小结小结为了提高程序的鲁棒性,程序需要对各种可能的异常进为了提高程序的鲁棒性,程序需要对各种可能的异常进行处理行处理某些错误需要异地处理某些错误需要异地处理C+的异常机制由的异常机制由try、throw和和catch构成构成第32页,本讲稿共32页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁