- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章异常处理 《面向对象程序设计》 八、异常处理 内容提要 程序中潜在的异常问题 异常处理机制 C++中的异常处理 标准异常 使用异常处理应注意的几个问题 提出问题 【例】求解一元二次方程ax2+bx+c=0 #includeiostream #includecmath using namespace std; int main() { float a,b,c; double x1,x2; cout请输入一元二次方程的系数a、b和c的值:; cinabc; x1=(-b+sqrt(b*b-4*a*c))/2*a; x2=(-b-sqrt(b*b-4*a*c))/2*a; cout方程的实根是: x1=x1 x2=x2endl; return 0; } 程序中潜在的异常问题 问题的分析 能够正常运行的程序可能存在很多潜在隐患。程序运行时可以检测到的一些非正常情况称为异常(Exception)。如除数为0,数组越界访问,内存空间不够,输入输出不正常(文件找不到、输入数据类型错等)等等。 异常是程序错误一种形式。 程序中的错误按性质可分为: 语法错误(关键字拼写错、标识符未定义、语句不完整等) 逻辑错误(算法设计有误导致得不到期望结果) 异常(出现是不可避免的,必须加以控制和处理) 异常处理机制 需要进行异常处理,从而减少异常对程序运行的影响,提高程序的容错性。 异常处理机制提供了系统层次上的标准设施,其主要任务有以下几点: 能够在异常发生时,在执出点抛出异常,并将有关异常的信息以类型的形式传递到异常处理模块; 建立模块之间的异常通信机制,特别是在多层模块之间实现异常有序的传递,保证抛出的每个异常都能被适当的异常处理模块捕获。 保证异常发生时能自动释放异常模块所占用的系统资源。 对于不执行异常处理的代码没有任何额外的运行负担。 将异常处理代码从普通代码中分离出来。 C++中的异常处理 异常的抛出、检测和捕获 异常在多层模块间的传递 异常接口声明 异常处理中析构函数的调用 异常类的层次结构 异常的抛出、检测和捕获 异常抛出、检测和捕获的语法定义如下: 异常抛出: throw 表达式; 异常的检测和捕获由try-catch结构实现: try {被检测可能会发生异常的语句} catch(异常的类型) {异常处理的语句} int main() { float a,b,c; double x1,x2; cout请输入一元二次方程的系数abc:; cinabc; try { if(0 == a) throw a;// b并无意义,代表float型即可 if((b*b-4*a*c)0) throw 1.0; x1=(-b+sqrt(b*b-4*a*c))/2*b; x2=(-b-sqrt(b*b-4*a*c))/2*b; cout方程的实根是: x1=x1 x2=x2endl; } catch(float) //捕获float类型的异常 { cout系数b不能为0,方程无解!endl; } catch(double) //捕获double类型的异常 { cout开方为负值,方程无解!endl; } cout程序结束!endl; return 0; } 异常在多层模块间的传递 【例】函数嵌套情况下的异常处理 typedef struct zero//声明除数为零异常类型 {string s;}ZERO; typedef struct negative//声明开方值为负异常类型 {string s;}NEGATIVE; fun2(int a,int b,int c)//抛出异常的函数 { ZERO s1;NEGATIVE s2;s1.s=除数为零;s2.s=开方值为负数; if(0 == a) throw s1; if((b*b-4*a*c)0) throw s2; return sqrt(b*b-4*a*c); } fun1(int a,int b,int c) { //捕获异常并重新抛出异常 try { return (-b+fun2(a,b,c))/(2*a); } catch(ZERO) { throw;//重新抛出异常 } } int main() { float a,b,c; cout请输入一元二次方程的系数abc:; cinabc; try { cout方程的一个实根是: x1=fun1(a,b,c)endl; } catch(ZERO S1) //捕获除数为零异常,并处理异常 { coutS1.s,方程无解!endl; } catch(NEGATIVE S2)// 捕获开方值为负数异常,并处理异常
您可能关注的文档
最近下载
- 输液港常见并发症及处理.pptx VIP
- 海天蒙德Hi驱动器说明书.pdf
- 运动场土方工程方案(3篇).docx VIP
- 基于单片机的土壤湿度检测及控制系统设计.pdf VIP
- 2024年四川省宜宾市【辅警协警】笔试真题(附答案).docx
- GB_T 311.4-2010绝缘配合 第4部分:电网绝缘配合及其模拟的计算导则.docx VIP
- 大学生职业生涯规划与就业指导(高校学生学习职业生涯规划与就业指导课程)全套教学课件.pptx
- 220kv变电站新建工程施工组织设计.docx VIP
- GB_T 311.2-2013绝缘配合 第2部分:使用导则.docx VIP
- 6.3三角形的中位线 课件(共22张PPT).pptx VIP
文档评论(0)