欢迎来到天天文库
浏览记录
ID:41972158
大小:188.50 KB
页数:17页
时间:2019-09-05
《例外处理和命名空间》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第11章例外处理和命名空间11.1例外处理大型和十分复杂的程序往往会产生一些很难查找的甚至是无法避免的运行时错误。当发生运行时错误时,不能简单地结束程序运行,而是退回到任务的起点,指出错误,并由用户决定下一步工作。面向对象的异常处理(exceptionhandling)机制是C++语言用以解决这个问题的有力工具。11.1例外处理异常的概念:这里所讲的异常(exception)是程序可能检测到的,运行时不正常的情况,异常就是程序在运行的过程中,由于使用环境的变化以及用户的不当操作而产生的错误。例如,内存不足时
2、,应用程序请求分配内存;请求打开硬盘上不存在的文件;程序中出现了以零为除数的错误;打印机未打开,调制解调器掉线等,导致程序运行中挂接这些设备失败等等,都会引发异常。对这些错误,应用程序如果不能进行合适的处理,将会使程序变得非常脆弱,甚至不可使用。因此,对于这些可以预料的错误,在程序设计时,应编制相应的预防代码或处理代码,以便防止异常发生后造成严重后果。11.1例外处理一个应用程序,既要保证其正确性,还应有容错能力,也就是说,既要在正确的应用环境中、用户操作正确时运行正常、正确,而且要在应用环境出现意外或用户
3、操作不当时,也应有合理的反应。特别在一个大型的程序(软件)中,程序各部分是由不同的小组编写的,它们由公共接口连起来,错误可能就发生在相互的配合上,也可能发生在事先根本想不到的个别的条件组合上。11.1例外处理本章介绍的技术,尽管是为大型软件工程开发所发展的,但是它在标准C++中已经成为一个标准的技术,在任何规模的程序中都可以使用。C++提供了一些内置的语言特性来抛出(throw)异常,用以通知“异常已经发生”,然后由预先安排的程序段来捕获(catch)异常,并对它进行处理。这种机制可以在C++程序的两个无关
4、(往往是独立开发)的部分进行“异常”通信。由程序某一部分引发了另一部分的异常,这一异常可回到引起异常的部分去处理(沿着程序函数的调用链)。这也是分清处理责任的好办法。异常处理机制异常处理的基本思想小型程序在出现异常时,一般是将程序立即中断运行,无条件释放所有资源。如:11.1例外处理例14.1以下程序当除数为零时,停止运行并给出提示信息#include#includedoublefuc(doublex,doubley){if(y==0){cerr<<"erroro
5、fdividingzero.";exit(1);}returnx/y;}voidmain(){fuc(2,3);fuc(4,0);}11.1例外处理2.大中型程序中,上述处理方法就过于简单粗糙。这是因为在大中型程序中,函数之间有着明确的分工和复杂的调用关系。发现错误的程序往往在函数调用链的低层,这样,简单地在发现错误的函数中处理异常,就没有机会把调用链中的上层函数已经完成的一些工作做妥善的善后处理。例如,上层函数已经申请了堆对象,那么释放堆对象的工作显然不能在底层函数中处理,从而使程序不能正常运行。因此
6、,对于大中型程序来说,在程序运行中一旦发生异常,应该允许恢复和继续运行。11.1例外处理恢复是指把产生异常的错误处理掉,中间可能要涉及一系列函数调用链的退栈,对象的析构,资源的释放等。继续运行是指异常处理之后,在紧接着异常处理的代码区域中继续运行。异常处理实现C++异常处理的步骤是:1.定义异常(try语句块)try{//将可能产生异常的语句放在try语句块中}2.定义异常处理(catch语句块)将处理异常的语句放在catch语句块中,以便异常被传递来时处理。通常,异常处理是紧接在try语句块后的若干个相邻
7、的catch语句,每一个catch语句的格式是:catch(异常类型1){//异常处理语句块1}11.1例外处理3.抛弃异常(throw语句)检测是否产生异常,若是,则抛弃异常。抛弃异常语句的格式是:throw表达式;11.1例外处理try{可能出现异常的语句块}catch(异常类型声明1){异常处理语句块1}catch(异常类型声明2){异常处理语句块2}…catch(异常类型声明n){异常处理语句块n}11.1例外处理例14.2处理文件打不开的异常#include#include<
8、iostream.h>#includevoidmain(){ifstreamsource("c:abc.txt");//打开文件charline[128];try//定义异常{if(source.fail())throw"abc.txt";//抛掷异常}catch(char*s)//定义异常处理{cout<<"erroropeningthefile"<
此文档下载收益归作者所有