已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十二章异常处理,清华大学郑莉,目录,12.1异常处理的基本思想12.2C+异常处理的实现12.3异常处理中的构造与析构12.4标准程序库异常处理12.5综合实例对个人银行账户管理程序的改进12.6深度探索12.7小结,2,12.1异常处理的基本思想,3,12.2.1异常处理的语法,4,12.2C+异常处理的实现,抛掷异常的程序段.throw表达式;.,捕获并处理异常的程序段try复合语句catch(异常声明)复合语句catch(异常声明)复合语句,保护段,异常处理程序,12.2.1异常处理的语法(续),若有异常则通过throw操作创建一个异常对象并抛掷。将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。如果匹配的处理器未找到,则运行库函数terminate将被自动调用,其缺省功能是调用abort终止程序。,5,12.2C+异常处理的实现,例12-1处理除零异常,/12_1.cpp#includeusingnamespacestd;intdivide(intx,inty)if(y=0)throwx;returnx/y;intmain()trycout5/2=divide(5,2)endl;cout8/0=divide(8,0)endl;cout7/1=divide(7,1)endl;catch(inte)couteisdividedbyzero!endl;coutThatisok.endl;return0;,6,12.2C+异常处理的实现12.2.1异常处理的语法,结果如下:5/2=28isdividedbyzero!Thatisok.,12.2.2异常接口声明,可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如:voidfun()throw(A,B,C,D);若无异常接口声明,则此函数可以抛掷任何类型的异常。不抛掷任何类型异常的函数声明如下:voidfun()throw();,7,12.2C+异常处理的实现,12.3异常处理中的构造与析构,找到一个匹配的catch异常处理后初始化异常参数。将从对应的try块开始到异常被抛掷处之间构造(且尚未析构)的所有自动对象进行析构。从最后一个catch处理之后开始恢复执行。,8,例12-2使用带析构语义的类的C+异常处理,/12_2.cpp#include#includeusingnamespacestd;classMyExceptionpublic:MyException(conststring,9,12.3异常处理中的构造与析构,voidfunc()throw(MyException)Demod;coutThrowMyExceptioninfunc()endl;throwMyException(exceptionthrownbyfunc();intmain()coutInmainfunctionendl;tryfunc();catch(MyException,10,例12-2(续),12.3异常处理中的构造与析构,例12-2(续),结果如下:InmainfunctionConstructorofDemoThrowMyExceptioninfunc()DestructorofDemoCaughtanexception:exceptionthrownbyfunc()Resumetheexecutionofmain(),11,12.3异常处理中的构造与析构,12.4标准程序库异常处理,12,标准程序库的异常类,exception:标准程序库异常类的公共基类logic_error表示可以在程序中被预先检测到的异常如果小心地编写程序,这类异常能够避免runtime_error表示难以被预先检测的异常,13,12.4标准程序库异常处理,例12-3三角形面积计算,编写一个计算三角形面积的函数,函数的参数为三角形三边边长a、b、c,可以用Heron公式计算:设,则三角形面积,14,12.4标准程序库异常处理,例12-3(续),/12_3.cpp#include#include#includeusingnamespacestd;/给出三角形三边长,计算三角形面积doublearea(doublea,doubleb,doublec)throw(invalid_argument)/判断三角形边长是否为正if(a=0|b=0|c=0)throwinvalid_argument(thesidelengthshouldbepositive);/判断三边长是否满足三角不等式if(a+b=c|b+cbc;trydoubles=area(a,b,c);/尝试计算三角形面积coutArea:sendl;catch(exception,16,12.4标准程序库异常处理,例12-3(续),运行结果1:Pleaseinputthesidelengthsofatriangle:345Area:6运行结果2:Pleaseinputthesidelengthsofatriangle:055Error:thesidelengthshouldbepositive运行结果2:Pleaseinputthesidelengthsofatriangle:124Error:thesidelengthshouldfitthetriangleinequation,17,12.4标准程序库异常处理,12.5综合实例对个人银行账户管理程序的改进,本例中,在构造或输入一个Date对象时如发生了错误,直接使用标准程序库中的runtime_error构造异常并抛出;在账户类中如发生了错误,由于希望异常信息能够标识是哪个账户发生了错误。本程序中创建了一个类AccountException,该类从runtime_error派生,该类中保存了一个Account型常指针,指向发生错误的账户,这样在主函数中,输出错误信息的同时也可以将账号输出。,18,/date.cpp,仅列出与以前不同的内容,下同#includedate.h#include#includeusingnamespacestd;Date:Date(intyear,intmonth,intday):year(year),month(month),day(day)if(daygetMaxDay()throwruntime_error(Invaliddate);intyears=year-1;totalDays=years*365+years/4-years/100+years/400+DAYS_BEFORE_MONTHmonth-1+day;if(isLeapYear(),19,12.5综合实例对个人银行账户管理程序的改进,例12-4,/account.h#ifndef_ACCOUNT_H_#define_ACCOUNT_H_#includedate.h#includeaccumulator.h#include#include#include#include/account.h中增加了以下类,其它各类的定义与例11-13完全相同,不再重复给出classAccountException:publicstd:runtime_errorprivate:constAccount*account;public:AccountException(constAccount*account,conststd:string#endif/_ACCOUNT_H_,20,12.5综合实例对个人银行账户管理程序的改进,例12-4(续),/account.cpp中仅以下成员函数的实现与例11-13不同,其它内容皆与之完全相同voidAccount:error(conststring/关闭文件,21,12.5综合实例对个人银行账户管理程序的改进,例12-4(续),ofstreamfileOut(FILE_NAME,ios_base:app);/以追加模式cout;stringcmdLine;getline(cin,cmdLine);tryif(controller.runCommand(cmdLine)fileOutgetId():e.what()w21500buyatelevision2009-1-1#C5392394-1500-1550buyatelevision2009-1-1Total:18982.9commandq2008-12-52009-1-32Error:Invaliddate2009-1-1Total:18982.9commandq2008-12-52009-1-312008-12-5#S3755217550010500salary2009-1-1#S375521717.7710517.8interest2009-1-1#0234234215.1610015.2interest2009-1-1#C5392394-50-50annualfee2009-1-1#C5392394-1500-1550buyatelevision2009-1-1Total:18982.9commande,23,12.5综合实例对个人银行账户管理程序的改进,12.6.1异常安全性问题,一个异常安全的函数,在有异常抛出时:不应泄露任何资源不能使任何对象进入非法状态反例:例9-8中的下列代码:templatevoidStack:push(constT/将新元素压入栈顶如果赋值过程中有异常抛出,由于top已经增1,栈顶的内容将变得不确定。,24,12.6深度探索,12.6.1异常安全性问题(续),该函数的修正版本:templatevoidStack:push(constT即使赋值时抛出异常,由于此时top并没有真正增1,因此当前对象的状态没有改变,该函数是异常安全的。,25,12.6深度探索,编写异常安全程序的原则,明确哪些操作绝对不会抛掷异常这些操作是异常安全编程的基石例:基本数据类型的绝大部分操作,针的赋值、算术运算和比较运算,STL容器的swap函数尽量确保析构函数不抛掷异常,26,12.6深度探索12.6.1异常安全性问题,12.6.2避免异常发生时的资源泄漏,一个函数,必须在有异常向外抛出前,释放应由它负责释放的资源。通常的解决方案把一切动态分配的资源都包装成栈上的对象,利用抛掷异常时自动调用对象析构函数的特性来释放资源。对于必须在堆上构造的对象,可以用智能指针auto_ptr加以包装。,27,12.6深度探索,智能指针auto_ptr,C+标准库的一个类模板在memory头文件中定义有一个类型参数X,表示智能指针指向数据的类型每个智能指针对象关联一个普通指针构造函数:explicitauto_ptr(X*p=0)throw();获得与智能指针对象关联的指针:X*get()constthrow();由于auto_ptr的“*”与“-”运算符已被重载,对一个auto_ptr的对象使用“*”和“-”,等价于对它所关联的指针使用相应运算符。,28,12
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年医学生职业生涯规划书职业决策
- 2026年常见职业危害相应职业禁忌症
- 2026年新生入学仪式活动方案设计
- 萍乡卫生职业学院《经济管理分析软件应用基础》2026-2027学年第一学期期末试卷含解析
- 江西工商职业技术学院《微机系统与接口》2026-2027学年第一学期期末试卷含解析
- 山东职业学院《曲式与作品分析基础(二)》2026-2027学年第一学期期末试卷含解析
- 怀化学院《学术道德与论文写作》2026-2027学年第一学期期末试卷含解析
- 印刷包装厂环保排放制度
- 关于危化品仓库外部张贴各种警示标志的指导建议
- 供应链管理规范
- 2026年临床医师资格考试题
- 2026广西南宁市良庆区良庆镇人民政府招聘工作人员21人备考题库完整答案详解
- 江苏省建筑施工标准化文明示范工地标准
- 2026年煤矿重大事故隐患判定标准题库(含答案)
- 2026年煤矿事故重大隐患考试题目及答案
- 2025年湖南长沙市初二地生会考题库及答案
- 改造工程监理大纲
- 《TSG08-2026特种设备使用管理规则》培训课件
- DB3716-T 11-2022 银耳病虫害绿色防控技术规程
- 2026年中储粮统计岗专业知识与应用考核练习题
- 江苏省仿古建筑与园林工程费用计算规则
评论
0/150
提交评论