第6章面向对象程的序设计课件.ppt

  1. 1、本文档共76页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章面向对象程的序设计课件

6.4 C++异常处理的实现 6.4.3 异常的传递方向 在函数嵌套调用的情况下,异常的传递方向正好是从异常发生的地方开始,沿着函数的调用关系链逐层向上寻找与之匹配的异常处理器(catch块),直到到达主函数. 如果主函数中仍然没能找到与之匹配的异常处理器,则会引起系统对当前程序的强行终止。 【例6-14】通过一个简单的函数嵌套调用,用来说明异常的传播方向。 (1)函数嵌套时异常的传递方向 (2)异常抛出后,最近的一个匹配的异常处理器将捕获该异常。如果将f4()函数中的catch子句改为catch(double), (3)如果在此基础上再将f4()函数中的catch块改为: catch(double) { cout在f4()中捕获异常,并在此进行处理!endl; throw; } (4)如果将例6-14中变量a的类型由double改为unsigned,则该异常抛出后一直传递到main()函数都不能被某个catch所捕获,因此将会调用terminate()函数强行终止,程序的报错窗口。 6.4 C++异常处理的实现 【例6-15】异常传播的又一个例子 #include iostream using namespace std; int add(int a, int b) //结果过大过小时都抛出异常 { int res; try { res=a+b; if (res128) //抛出整型异常 throw res; if (res0) //抛出字符串异常 throw Negative result!; } catch(int e) { //捕获到整型异常 coutLarge result exception: eendl; return -1; } return res; } 6.4 C++异常处理的实现 void main() { int a, b, result; coutEnter two integers:; while(cinab) { try { result=add(a, b); if(result = 0) coutThe normal result: resultendl; } catch(...) { //捕获传播到外层的所有异常 coutUnexpected exception!endl; } cout\nEnter a integer:; } } 6.4.4 异常接口声明 为了加强程序的可读性,使函数的调用者能够方便地知道他所使用的函数会抛出哪些异常,可以在函数的声明中列出这个函数可能抛出的所有异常类型,这就是异常接口声明。 例如:void fun() throw(A,B,C,D); 这表明函数fun()能够且只能够抛出类型A,B,C,D及其子类型的异常。 如果在函数的声明中没有包括异常接口声明,则此函数可以抛出任何类型的异常, 例如: void fun(); 一个不抛出任何类型异常的函数可以进行如下形式的声明: void fun() throw(); 需要说明的是:对内联函数不能进行异常接口声明。 6.4 C++异常处理的实现 6.5 异常处理中的构造与析构 C++异常处理的真正能力不仅在于它能处理各种不同类型的异常,还在于它具有在异常处理前为构造的所有局部对象自动调用析构函数的能力 如果在try块(或try块中调用的函数)中定义了类对象,在建立该对象时要调用构造函数。 在执行try块(包括在try块中调用其他函数)的过程中如果发生了异常,此时流程立即离开try块(如果是在try块调用的函数中发生异常,则流程首先离开该函数,回到调用它的try块处,然后流程再从try块中跳出转到该异常被捕获的catch块)。 这样流程就有可能离开该对象的作用域而转到其他函数,因而应当事先做好结束对象前的清理工作。 C++的异常处理机制会在throw抛出异常信息被catch捕获时,对有关的局部对象进行析构(调用相应类对象的析构函数),析构对象的顺序与构造的顺序相反,然后执行与异常信息匹配的catch块中的语句 【例6-16】异常处理中析构函数的调用。 【例6-16】异常处理中析构函数的调用。 #include iostream #include string using namespace std; class Student { public: Studen

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档