例外处理和命名空间.ppt

上传人:s****8 文档编号:93240473 上传时间:2023-07-01 格式:PPT 页数:17 大小:188.50KB
返回 下载 相关 举报
例外处理和命名空间.ppt_第1页
第1页 / 共17页
例外处理和命名空间.ppt_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《例外处理和命名空间.ppt》由会员分享,可在线阅读,更多相关《例外处理和命名空间.ppt(17页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第11章 例外处理和命名空间11.1 例外处理例外处理 大型和十分复杂的程序往往会产生一大型和十分复杂的程序往往会产生一些很难查找的甚至是无法避免的运行时些很难查找的甚至是无法避免的运行时错误。错误。当发生运行时错误时,不能简单地结当发生运行时错误时,不能简单地结束程序运行,而是退回到任务的起点,束程序运行,而是退回到任务的起点,指出错误,并由用户决定下一步工作。指出错误,并由用户决定下一步工作。面向对象的异常处理(面向对象的异常处理(exception handling)机制是)机制是C+语言用以解决这语言用以解决这个问题的有力工具。个问题的有力工具。11.1 例外处理例外处理异常的概念异常

2、的概念:这里所讲的这里所讲的异常(异常(exceptionexception)是程序可能检测到的,)是程序可能检测到的,运行时不正常的情况,运行时不正常的情况,异常异常就是程序在运行的过程中,就是程序在运行的过程中,由于使用环境的变化以及用户的不当操作而产生的错由于使用环境的变化以及用户的不当操作而产生的错误。误。例如,内存不足时,应用程序请求分配内存;例如,内存不足时,应用程序请求分配内存;请求打开硬盘上不存在的文件;程序中出现了以零为请求打开硬盘上不存在的文件;程序中出现了以零为除数的错误;打印机未打开,调制解调器掉线等,导除数的错误;打印机未打开,调制解调器掉线等,导致程序运行中挂接这些

3、设备失败等等,都会引发异常。致程序运行中挂接这些设备失败等等,都会引发异常。对这些错误,应用程序如果不能进行合适的处理,将对这些错误,应用程序如果不能进行合适的处理,将会使程序变得非常脆弱,甚至不可使用。因此,对于会使程序变得非常脆弱,甚至不可使用。因此,对于这些可以预料的错误,在程序设计时,应编制相应的这些可以预料的错误,在程序设计时,应编制相应的预防代码或处理代码,以便防止异常发生后造成严重预防代码或处理代码,以便防止异常发生后造成严重后果。后果。11.1 例外处理例外处理 一个应用程序,既要保证其正确性,还应一个应用程序,既要保证其正确性,还应有容错能力,也就是说,既要在正确的应用环有容

4、错能力,也就是说,既要在正确的应用环境中、用户操作正确时运行正常、正确,而且境中、用户操作正确时运行正常、正确,而且要在应用环境出现意外或用户操作不当时,也要在应用环境出现意外或用户操作不当时,也应有合理的反应。应有合理的反应。特别在一个大型的程序(软件)中,程序特别在一个大型的程序(软件)中,程序各部分是由不同的小组编写的,它们由公共接各部分是由不同的小组编写的,它们由公共接口连起来,错误可能就发生在相互的配合上,口连起来,错误可能就发生在相互的配合上,也可能发生在事先根本想不到的个别的条件组也可能发生在事先根本想不到的个别的条件组合上。合上。11.1 例外处理例外处理 本章介绍的技术,尽管

5、是为大型软件工程本章介绍的技术,尽管是为大型软件工程开发所发展的,但是它在标准开发所发展的,但是它在标准C+中已经成为中已经成为一个标准的技术,在任何规模的程序中都可以一个标准的技术,在任何规模的程序中都可以使用。使用。C+提供了一些内置的语言特性来提供了一些内置的语言特性来抛出抛出(throw)异常,用以通知异常,用以通知“异常已经发生异常已经发生”,然后由预先安排的程序段来,然后由预先安排的程序段来捕获(捕获(catch)异常,并对它进行处理。这种机制可以在异常,并对它进行处理。这种机制可以在C+程序的两个无关(往往是独立开发)的部分进程序的两个无关(往往是独立开发)的部分进行行“异常异常

6、”通信。由程序某一部分引发了另一通信。由程序某一部分引发了另一部分的异常,这一异常可回到引起异常的部分部分的异常,这一异常可回到引起异常的部分去处理(沿着程序函数的调用链)。这也是分去处理(沿着程序函数的调用链)。这也是分清处理责任的好办法。清处理责任的好办法。异常处理机制异常处理机制异常处理的基本思想异常处理的基本思想1.1.小型程序在出现异常时,一般是将程序立即小型程序在出现异常时,一般是将程序立即中断运行,无条件释放所有资源。中断运行,无条件释放所有资源。如:如:11.1 例外处理例外处理例14.1 以下程序当除数为零时,停止运行并给出提示信息#include#includedouble

7、 fuc(double x,double y)if(y=0)cerrerror of dividing zero.n;exit(1);return x/y;void main()fuc(2,3);fuc(4,0);11.1 例外处理例外处理2.2.大中型程序中,上述处理方法就过于简大中型程序中,上述处理方法就过于简单粗糙。这是因为在大中型程序中,函数之间单粗糙。这是因为在大中型程序中,函数之间有着明确的分工和复杂的调用关系。发现错误有着明确的分工和复杂的调用关系。发现错误的程序往往在函数调用链的低层,这样,简单的程序往往在函数调用链的低层,这样,简单地在发现错误的函数中处理异常,就没有机会地在

8、发现错误的函数中处理异常,就没有机会把调用链中的上层函数已经完成的一些工作做把调用链中的上层函数已经完成的一些工作做妥善的善后处理。例如,上层函数已经申请了妥善的善后处理。例如,上层函数已经申请了堆对象,那么释放堆对象的工作显然不能在底堆对象,那么释放堆对象的工作显然不能在底层函数中处理,从而使程序不能正常运行。因层函数中处理,从而使程序不能正常运行。因此,对于大中型程序来说,在程序运行中一旦此,对于大中型程序来说,在程序运行中一旦发生异常,应该允许恢复和继续运行。发生异常,应该允许恢复和继续运行。11.1 例外处理例外处理恢复恢复是指把产生异常的错误处理掉,中是指把产生异常的错误处理掉,中间

9、间可能要涉及一系列函数调用链的退栈,可能要涉及一系列函数调用链的退栈,对象的析构,资源的释放对象的析构,资源的释放等。等。继续运行继续运行是指异常处理之后,在紧接着异常处理是指异常处理之后,在紧接着异常处理的代码区域中继续运行。的代码区域中继续运行。异常处理实现异常处理实现C+异常处理的步骤是:异常处理的步骤是:1定义异常(定义异常(try语句块)语句块)try/将可能产生异常的语句放在try语句块中2定义异常处理(定义异常处理(catch语句块)语句块)将将处处理理异异常常的的语语句句放放在在catch语语句句块块中中,以以便便异异常常被被传传递递来来时时处处理理。通通常常,异异常常处处理理

10、是是紧紧接接在在try语语句句块块后后的的若若干干个个相相邻邻的的catch语语句句,每一个每一个catchcatch语句的格式是:语句的格式是:catch(异常类型1)/异常处理语句块111.1 例外处理例外处理3抛弃异常(抛弃异常(throw语句)语句)检检测测是是否否产产生生异异常常,若若是是,则则抛抛弃弃异异常常。抛抛弃弃异常语句的格式是:异常语句的格式是:throw 表达式;11.1 例外处理例外处理try可能出现异常的语句块catch(异常类型声明1)异常处理语句块1catch(异常类型声明2)异常处理语句块2catch(异常类型声明n)异常处理语句块n11.1 例外处理例外处理例

11、例14.2 14.2 处理文件打不开的异常处理文件打不开的异常#includeinclude#include#include#include#include void main()void main()ifstream ifstream source(c:abc.txtsource(c:abc.txt););/打开文件打开文件char line128;char line128;trytry/定义异常定义异常 if(if(source.failsource.fail()()throw throw abc.txtabc.txt;/抛掷异常抛掷异常 catch(charcatch(char*s)*s

12、)/定义异常处理定义异常处理 coutcouterror opening the file serror opening the file sendlendl;exit(1);exit(1);while(!source.eofwhile(!source.eof()()source.getline(linesource.getline(line,sizeof(linesizeof(line););coutcoutlinelineendlendl;source.closesource.close();();11.1 例外处理例外处理异常处理的执行过程是:异常处理的执行过程是:1 1程程序序通通过过

13、正正常常的的顺顺序序执执行行到到trytry语语句句,然然后后执执行行trytry语句块内的程序段。语句块内的程序段。2 2如如果果在在trytry语语句句块块执执行行期期间间没没有有发发生生异异常常(也也就就是是说说没没有有执执行行到到throwthrow语语句句),则则catchcatch语语句句块块不不被被执执行。行。3 3如如果果在在trytry语语句句块块执执行行期期间间或或在在该该语语句句块块直直接接或或间间接接调调用用的的任任何何函函数数中中发发生生了了异异常常,并并将将异异常常抛抛掷掷,则则该该异异常常将将沿沿调调用用链链上上传传,直直到到找找到到与与该该异异常常类类型型相相匹

14、匹配配的的catchcatch语语句句块块来来处处理理异异常常。异异常常处处理理后后,执行所有执行所有catchcatch语句块的后续程序。语句块的后续程序。4 4如果未找到与该异常类型相匹配的如果未找到与该异常类型相匹配的catchcatch语句块,语句块,则由系统终止程序的运行。则由系统终止程序的运行。11.1 例外处理例外处理异常处理时注意的问题:异常处理时注意的问题:1 1 C+C+只只理理会会放放在在trytry语语句句块块内内受受监监控控的的过过程程的的异异常常,那那些些不不受受监控的过程的异常,监控的过程的异常,C+C+是不会处理的。是不会处理的。2 2在在trytry语语句句块

15、块之之后后必必须须紧紧跟跟一一个个或或多多个个catchcatch语语句句块块,以以便便对对发发生生的的异异常常进进行行处处理理。在在trytry语语句句块块出出现现之之前前,不不能能出出现现catchcatch语句块。语句块。3 3catchcatch语语句句的的括括号号中中只只能能有有一一个个形形参参,但但该该形形参参是是可可选选的的,而而形形参参的的数数据据类类型型不不能能缺缺省省必必须须保保留留,因因为为捕捕获获是是利利用用数数据据类类型型的的匹匹配配实实现现的的。形形参参可可以以是是“”,表表示示捕捕获获所所有有的的,应应将它放置在所有的将它放置在所有的catchcatch语句之后语

16、句之后 。4 4ThrowThrow语语句句的的表表达达式式可可以以省省略略,其其含含义义是是重重新新向向上上抛抛掷掷正正在在处处理理的的异异常常。通通常常用用于于在在catchcatch语语句句中中进进行行部部分分处处理理后后,要要求求调调用链上端继续处理该异常的情形。用链上端继续处理该异常的情形。5 5抛弃异常与处理异常可以放在不同的函数中。抛弃异常与处理异常可以放在不同的函数中。6 6 C+C+允允许许对对函函数数进进行行异异常常声声明明,即即:在在声声明明中中注注明明函函数数可可能能抛弃的异常类型,其语法为:抛弃的异常类型,其语法为:返回值类型 函数名(形参列表)throw(异常类型1

17、,异常类型2,)异常处理的实现异常处理的实现例例14.3 处理除零异常。处理除零异常。#includedouble Div(double,double);void main()try/定义异常 cout7.3/2.0=Div(7.3,2.0)endl;cout7.3/0.0=Div(7.3,0.0)endl;cout7.3/1.0=Div(7.3,1.0)endl;catch(double)/定义异常处理函数coutexception of deviding zero.n;coutthat is ok.n;double Div(double a,double b)if(b=0.0)throw b;/抛掷异常return a/b;

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

当前位置:首页 > 生活休闲 > 生活常识

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com