第14章异常(免费阅读).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第14章 异常处理 程序应该具有一定的容错功能。也就是说,在环境条件出现 异常情况下,不会轻易出现死机和灾难性的后果,而应有正确 合理的表现。这就是异常处理。 C++提供了异常处理机制,它使得程序出现错误时,力争 做到允许用户排除环境错误,继续运行程序。 目录 14.1 异常处理概述 14.2 C++异常处理的实现 14.2.1 异常处理的语法 14.2.2 捕获所有类型的异常 14.2.3 带有异常说明的函数原型 14.3 异常处理中对象的构造与析构 例:处理除数为0的情况 int div(int x,int y) { return x/y; } void main() { coutdiv(5,0); //异常程序终止 } 异常处理的基本思想: 在一个大型软件中,函数间有明确的分工和复杂的调用关系,发现错误的函数往往不具备错误处理的能力。这时它就引发一个异常,希望它的调用者能够捕获这个异常并处理这个错误。如果调用者也不能处理这个错误,还可以继续传递给上级调用者去处理,这种传播会一直继续到异常被处理为止。 如果程序始终没处理这个异常,最终它会被传到C++运行系统那里,运行系统捕获这异常后通常只是简单地终止这个程序。 异常处理的好处: C++异常处理机制使得异常的引发和处理不必在同一函数中,这样底层的函数可以着重解决问题,而不必过多考虑对异常的处理。上层调用者可以在适当位置设计对不同类型异常的处理。 异常处理机制将程序中的正常处理代码与异常处理代码显式区别开来,提高了程序的可读性。 14.2 C++异常处理的实现 C++语言异常处理机制 基本思想是将异常的检测与处理分离。 当一个函数体中检测到异常条件存在,但无法确定相应的处理方法时,将引发一个异常。 并由函数的直接或间接调用者检测并处理这个异常 用3个保留字实现:throw、try和catch 在一般情况下,被调用函数直接检测到异常条件的存在并使用throw引发一个异常(注意,C++语言的异常是由程序员控制引发的,而不是由计算机硬件或程序运行环境控制的); 在上层调用函数中使用try检测函数调用是否引发异常; 检测到的各种异常由catch捕获并作相应处理。 try 例:原来的处理除0异常 int div(int x,int y) { return x/y; } bool div(int x,int y,int z) { if(y==0) return false; else z=x/y; return true; } #include iostram.h int div(int,int); void main( ) { try { coutdiv(5, 2)endl; coutdiv(5, 0)endl; coutdiv(5,3)endl; } catch(int ) { cout“divided by 0”; } cout“That is ok!”endl; } #include iostram.h int div(int,int); void main( ) { try { g(); } catch(int ) { cout“divided by 0”; } cout“That is ok!”endl; } 14.2.2 捕获所有类型的异常 catch语句的顺序性和类型匹配性 列出多个catch语句时,按catch语句出现的次序作类型匹配 且只有一个匹配的catch语句被执行,其他的catch语句将被忽略 catch(…) 可以捕获任何异常——应放最后 因为有了catch (…),在任何情况下其他catch子句都不被检查在VC++6.0中,若catch(…)不是放在所有catch()语句的最后,则会出现编译错误。 【例14.3】 14.2.3 带有异常说明的函数原型 从前面异常处理的例子可以看出,调用一个函数时,除了了解函数的参数与返回值外,还必须了解函数的异常引发方式,以便设计异常处理程序应付函数调用过程中引发的异常。 异常的引发与捕获已成为函数之间接口的一部分,有必要在函数原型中也列出异常引发。 14.3 异常处理中对象的构造与析构 在程序中,找到一个匹配的catch异常处理后: 如果catch子句的异常类型说明是一个值参数,则其初始化方式是复制被抛掷的异常对象。 如果catch子句的异常类型说明是一个引用,则其初始化方式是使该引用指向异常对象。 当catch子句的异常类型说明参数被初始化后,便开始展开栈的过程。 这包括将从对应的try块开始到异常被抛掷处之间构造(且尚未析构)的所有自动对象进行析构。析构

文档评论(0)

tiangou + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档