C_C++语言程序设计(西电版)第14章_异常处理一教材教学课件.pptVIP

C_C++语言程序设计(西电版)第14章_异常处理一教材教学课件.ppt

  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文档。上传文档
查看更多
教学课件讲义PPT教学教案培训资料医学中小学上课资料

第十四章 异常处理 C/C++语言程序设计 龚尚福,贾澎涛主编 《C/C++语言程序设计》 西安电子科技大学出版社 第十四章 异常处理 14.1 异常处理机制 14.2 异常处理的实现 14.3 异常规范 14.4 小结 14.1异常处理机制 C++语言异常处理机制的基本思想是将异常的检测与处理分离。当在一个函数体中检测到异常条件存在,但却无法确定相应的处理方法时,该函数将引发一个异常,由函数的直接或间接调用者捕获这个异常并处理这个错误。如果程序始终没有处理这个异常,最终它会被传到C++运行系统那里,运行系统捕获异常后,通常只是简单地终止这个程序。 由于异常处理机制使得异常的引发和处理不必在同一函数中。这样,底层的函数可以着重解决具体问题而不必过多地考虑对异常的处理;上层调用者可以在适当的位置设计对不同类型异常的处理。 14.2异常处理的实现 C++的异常处理机制通过throw、try和catch三个语句来实现。一般情况下,被调用函数直接检测到异常处理条件的存在,并使用throw引发一个异常;在上层函数中,使用try监测函数确定是否引发异常;检测到的各种异常由catch捕获并作出相应的处理,从而使程序从这些异常事件中恢复过来。 14.2.1 异常处理的语法 throw语法 try语法 throw 表达式; try { 复合语句 } 3.catch语法 catch(异常类型1 参数1) { 复合语句1 //针对异常类型1的处理语句 } catch(异常类型2 参数2) { 复合语句2 //针对异常类型2的处理语句 } … catch(异常类型n 参数n) { 复合语句n //针对异常类型n的处理语句 } 14.2.2 异常处理的执行过程 通过正常的顺序执行到达try语句,然后执行try块内的保护段。 如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句不执行。程序从try块后面跟随的最后一个catch语句之后的语句继续执行下去。 如果在保护段执行期间或在保护段调用的任何函数中(直接或间接的调用)有异常被抛出,则通过throw创建一个异常对象(这隐含指可能包含一个拷贝构造函数)。 在此处,编译器在执行代码中寻找一个能够处理抛掷类型异常的catch处理程序(或一个能处理任何类型异常的catch处理程序)。catch处理程序按其在try块后出现的顺序被检查。如果没有找到合适的处理程序,则继续检查下一个动态封闭的try块查。此处理继续下去,直到最外层的封闭try块被检查完。 如果匹配的处理程序未找到,则函数terminate()被自动调用,该函数的默认功能是终止程序。 如果找到一个匹配的catch处理程序,且它通过值进行捕获,则其形参通过拷贝异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化为指向异常对象在形参被初始化之后,“循环展开栈”的过程开始。 例14.1 处理零异常。 catch处理程序的出现顺序很重要,因为在一个try块中,异常处理程序是按照它出现的顺序被检查的。只要找到一个匹配的异常类型,后面的异常处理都将被忽略。例如,在下面的异常处理块中,首先出现的是catch(…),它可以捕获任何异常,在任何情况下,其他的catch语句都不被检查。因此,catch(…)应该放在最后。 Try{ //… } catch(…) { //只在这里处理所有的异常, //后面的异常处理程序段不会被检查 } catch(const char *str){ //… } catch(int){ //… } 如果函数抛出了一个没有被列在异常规范中的异常会怎么样?程序只有在遇到某种不正常情况时异常才会被抛出。在编译时刻编译器不可能知道在执行时程序是否会遇到这些异常。因此一个函数的异常规范的违例只能在运行时刻才能被检测出来。如果函数抛出了一个没有被列在其异常规范中的异常,则系统调用C++标准库中定义的函数unexpected()。 unexpected()的缺省行为是调用terminate()。在某些条件下可能有必要改变unexpected()执行的动作,C++标准库提供了一种机制可让我们改变unexpected()的缺省行为: (1)空的异常规范保证函数不会抛出任何异常,例如函数no_problem()保证不会抛出任何异常。 extern void no_problem() throw(); (2)如果一个函数声明没有指定异常规范,则该函数可以抛出任何类型的异常。在被抛出的异常类型与异常规范中指定的类型之间不允许类型转换。 (3)也可以在函数指针的声明处给出一个异常规范,例如: void (*pf) (int) thr

文档评论(0)

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

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

1亿VIP精品文档

相关文档