版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+面向对象程序设计(第二版)主编 曹静 中国水利水电出版社C+面向对象程序设计(第二版)第九章 异常处理2022年5月23日星期一C+面向对象程序设计第九章 异常处理t9.1 异常处理的基本思想t9.2 C+异常处理的实现t9.3 异常处理中的构造与析构2022年5月23日星期一C+面向对象程序设计9.1 异常处理的基本思想t计算机程序在机器上运行时会产生错误,这些错误对于编程人员可以预料到但却无法避免。t在一个小型程序中,一旦程序运行时发生了异常,一般是将程序立即中断运行,从而无条件释放所有资源。而在一个较为复杂的软件中,函数与函数之间存在着各自明确的功能和相互间复杂的调用关系,发现错误的
2、函数又并不具备处理错误的能力。 2022年5月23日星期一C+面向对象程序设计tC+的异常处理机制使得异常的引发和处理不需要在同一函数内完成,它可以将异常向上传播,这样底层的函数可以专门用以解决具体问题,而上层的调用者就可以在适当的位置针对不同类型的异常设计处理。 9.1 异常处理的基本思想2022年5月23日星期一C+面向对象程序设计9.2 C+异常处理的实现t9.2.1 异常处理的机制t9.2.2 异常处理的规则2022年5月23日星期一C+面向对象程序设计9.2.1 异常处理的机制tC+语言提供了对处理异常情况的内部支持。在C+语言中,try、throw和catch语句就是用于实现异常处
3、理的机制。有了C+程序的异常处理机制,程序可以向更高的执行上下文传递意想不到的事件,使C+程序能更好地从各种异常事件中进行有效地恢复,从而更好地执行 2022年5月23日星期一C+面向对象程序设计t异常处理的机制的主体有两大部分,一是错误侦测区块,二是错误处理区块。 9.2.1 异常处理的机制2022年5月23日星期一C+面向对象程序设计try /错误侦测区块 复合语句 throw 异常类型表达式; /如果发生错误用throw语句抛出异常catch(异常类型1) /错误处理区块 复合语句catch(异常类型2) /错误处理区块 复合语句 catch() / 如果在前面并没有列举异常类型,则由此
4、处理区块处理 /错误处理区块 复合语句 /try-throw-catch后继续执行9.2.1 异常处理的机制2022年5月23日星期一C+面向对象程序设计ttry子句后的复合语句是代码的保护段。catch子句后的复合语句是用来处理异常的程序,处理由throw表达式抛掷的异常。t当错误侦测区块里的程序执行发生错误时,将会利用throw语句将异常类型抛出错误侦测区块,在对比catch语句中的异常类型后,寻找出并执行处理该异常类型的程序区块。当该区块执行完毕后,将继续执行catch语句后的程序。9.2.1 异常处理的机制2022年5月23日星期一C+面向对象程序设计t异常处理的执行过程分成以下几个步
5、骤:l控制通过正常的顺序执行到达try语句,然后执行try块内的代码保护段。 l如果在保护段执行期间没有引起异常,就不执行跟在try块后的catch子句,程序从异常被抛掷的try块后跟随的最后一个catch子句后面的语句继续执行下去。 9.2.1 异常处理的机制2022年5月23日星期一C+面向对象程序设计l如果在保护段执行期间或在保护段调用的任何函数中有异常被抛掷,则从通过throw操作数创建的对象中创建一个异常对象。 l如果匹配的处理器未找到,则运行函数terminate将被自动调用,而函数terminate的默认功能是调用abort终止程序。l如果找到了一个匹配的catch处理程序,且它
6、通过值进行捕获,则其行参通过拷贝异常对象进行初始化。 9.2.1 异常处理的机制2022年5月23日星期一C+面向对象程序设计9.2.2 异常处理的规则t编写异常处理程序的规则是: l如果预料某段程序代码(或对某个函数的调用)有可能发生异常,就将它放在try子句之后。l如果某段程序中出现了自己不能处理的异常,就可以使用throw语句来抛掷出这个异常,将它抛掷给调用者。 2022年5月23日星期一C+面向对象程序设计lcatch子句后的复合语句用来处理由throw表达式抛掷的异常。l当异常被抛掷以后,catch子句便依次被检查,若某个catch子句的异常类型声明与被抛掷的异常类型一致,则执行该段
7、异常处理程序。9.2.2 异常处理的规则2022年5月23日星期一C+面向对象程序设计t例:处理除零异常 #include using namespace std;int try_modulus(int,int);void main()try /代码保护段coutModulus(5,2) is try_modulus(5,2)endl;coutModulus(3,0) is try_modulus(3,0)endl;coutModulus(8,5) is try_modulus(8,5)endl;catch(char *s) /处理异常cerrs;coutend of the program.
8、n;int try_modulus(int x,int y)if(y=0) /检查被除数是否为零,是则抛出异常throw(exception of dividing zero!n);return x%y;9.2.2 异常处理的规则2022年5月23日星期一C+面向对象程序设计t程序运行结果为: Modulus(5,2) is 1exception of dividing zero!end of the program 9.2.2 异常处理的规则2022年5月23日星期一C+面向对象程序设计t在VC+6.0环境中,为了使用异常处理机制,需要进行以下设置:l打开Project Settings对话
9、框。l选择C / C+选项卡。l在Category栏中选择C+ language。l选择Enable Exception Handling 。9.2.2 异常处理的规则2022年5月23日星期一C+面向对象程序设计9.3 异常处理中的构造与析构tC+异常处理的功能较为完善,它不仅能够处理各种不同类型的异常,而且具有为异常抛掷前构造的所有局部对象自动调用析构函数的能力。2022年5月23日星期一C+面向对象程序设计t在一个程序中,找到一个匹配的catch异常处理后,如果catch子句的异常类型声明是一个值参数,那么在初始化时是赋值被抛掷的异常对象。如果catch子句的异常类型声明是一个引用,那么
10、在初始化时是使该引用指向异常对象。9.3 异常处理中的构造与析构2022年5月23日星期一C+面向对象程序设计t当catch子句的异常类型声明参数被初始化,栈的展开过程便开始了。这包括将从对应的try块开始到异常被抛掷处之间构造且尚未析构的所有自动对象进行析构。析构的顺序与构造的顺序相反。程序会从最后的一个catch处理之后开始恢复执行。 9.3 异常处理中的构造与析构2022年5月23日星期一C+面向对象程序设计t例:使用带析构语义的类的C+异常处理#include using namespace std;void MyFunc(void);class Exptpublic: Expt();
11、 Expt(); const char *ShowReason() const return Expt类异常。; ;9.3 异常处理中的构造与析构2022年5月23日星期一C+面向对象程序设计class Demopublic: Demo(); Demo();Demo:Demo() cout 构造 Demo. endl;Demo:Demo() cout 析构 Demo. endl;9.3 异常处理中的构造与析构2022年5月23日星期一C+面向对象程序设计void MyFunc() Demo D; cout 在MyFunc()中抛掷Expt类异常。 endl; throw Expt();int main() cout 在main函数中。 endl; try cout 在try块中,调用MyFunc()。 endl; MyFunc(); 9.3 异常处理中的构造与析构2022年5月23日星期一C+面向对象程序设计 catch( Expt E ) cout 在catch异常处理程序中。 endl; cout 捕获到Expt类型异常:; cout E.ShowReason() endl; catch( char *str ) cout 捕获到其它的异常: str endl; cout 回到main函数。从这里恢复执行。 endl; return
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026吉林大学中日联谊医院(白求恩第三医院)非编岗位人员招聘3人备考题库【26-3】附答案详解【黄金题型】
- 2026浙江宁波逸东豪生大酒店招聘7人备考题库附答案详解【培优a卷】
- 2026西藏阿里地区革吉县人力资源和社会保障局(医疗保障局)补聘基层劳动就业社会保障公共服务平台工作人员1人备考题库带答案详解(b卷)
- 2026中国统计信息服务中心(国家统计局社情民意调查中心)招聘10人备考题库及答案详解参考
- 2026宁夏银川永宁县卫生健康系统专业技术人员自主招聘59人备考题库(重点)附答案详解
- 2026江苏南京航空航天大学金城学院招聘备考题库(马克思主义学院)附完整答案详解(有一套)
- 2026河南郑州市郑东新区春华学校、郑州市郑东思贤学校招聘备考题库含答案详解(达标题)
- 【厦门】2025年中国地质科学院水文地质环境地质研究所第二批招聘应届毕业生10人笔试历年典型考题及考点剖析附带答案详解
- 2026四川现代种业集团科技创新中心有限公司三台分公司社会化招聘综合排名笔试历年参考题库附带答案详解
- 【衡阳】2025年湖南省衡阳市衡南县事业单位公开招聘工作人员21人笔试历年典型考题及考点剖析附带答案详解
- 国家安全生产考试焊工证电子版
- 九种体质辨识课件
- 2026年乌兰察布职业学院单招职业适应性测试题库必考题
- 食品生产车间管理制度
- 电解铝生产安全保障管理方案
- 2025年重庆历史高考试题及答案
- 煤气柜检修总结课件
- 校园心理健康安全自查及整改措施
- 膝关节骨折脱位课件
- 临期药品行业市场细分消费者需求变化分析报告
- 《水力学》课件(共十一章)
评论
0/150
提交评论