- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章-异常处理_V2
第9章异常处理 内容提要 1 异常处理概述 2 C++异常处理的实现机制 3 异常处理中的构造与析构 §9.1.异常处理概述 1 什么是异常处理 异常(Exception)——程序检测到的运行时刻不正常的情况。如被0 除、数组越界访问或空闲存储内存耗尽等等。 异常处理——是一种允许两个独立开发的程序组件在程序执行期间遇到程序不正常的情况时相互通信的机制。 这里的异常是指软件异常 2 异常处理的基本思想 原因:在一个大型软件中,由于函数之间有着明确的分工和复杂的调用关系,发现错误的函数往往不具备处理错误的能力。 C++语言异常处理机制的基本思想是将异常的检测与处理分离。 过程1:当在一个函数体中检测到异常条件存在,但却无法确定相应的处理方法时,该函数将引发一个异常,由函数的直接或间接调用者捕获这个异常并处理这个错误。 2 异常处理的基本思想(续) 过程2:如果程序始终没有处理这个异常,最终它会被传到C++运行系统那里,运行系统捕获异常后,通常只是简单地终止这个程序。 由于异常处理机制使得异常的引发和处理不必在同一函数中,这样,底层的函数可以着重解决具体问题而不必过多地考虑对异常的处理;上层调用者可以在适当的位置设计对不同类型异常的处理。 §9.2. 异常处理的实现机制 1 异常处理的实现结构 2 异常处理的执行过程 异常处理的执行过程如下: ①程序通过正常的顺序执行到达try语句,然后执行try块内的保护段。 ②如果在保护段执行期间没有引起异常,那么跟在try块后的catch语句就不执行,程序从最后一个catch语句后面的语句继续执行下去。 ③如果在保护段执行期间或在保护段调用的任何函数中(直接或间接的调用)有异常被抛掷,则从通过throw创建的对象中创建一个异常对象(隐含调用拷贝构造函数),程序转到catch处理段 。 2 异常处理的执行过程(续) 异常处理的执行过程: ④如果匹配的catch处理器未找到,则terminate()将被自动调用,该函数的默认功能是调用abort终止程序。 ⑤如果找到了一个匹配的catch处理程序,且它通过值进行捕获,则其形参通过拷贝异常对象进行初始化。在形参被初始化之后,“展开栈”的过程开始。这包括对那些在与catch处理器相对应的try块开始和异常丢弃地点之间创建的(但尚未析构的)所有局部对象的析构。 2 异常处理的执行过程(续) try块的重要性 try块包含了异常出现的语句。异常出现时,try块提示编译器到哪里去查找catch块。 异常未出现时,几乎没有额外的运行成本。(异常的成本取决于编译器) throw块的重要性 异常出现时,发出一个对象。(编译器初始化一个throw操作数的静态类型的临时对象。) 2 异常处理的执行过程(续) 编译器处理说明 编译器能够处理抛掷某种类型对象的异常,在更高执行上下文中寻找一个catch语句(或一个能处理任何类型异常的catch处理程序)。 catch处理程序按其在try块后出现的顺序被检查。如果没有找到合适的处理程序,则继续检查下一个外层动态封闭的try块。此处理继续下去,直到最外层的封闭try块被检查完。 3 异常处理示例 3 异常处理示例(续) 程序运行结果为: 5/2=2 exception of dividing zero. that is ok. 可以看出,执行下列语句时,函数Div()中发生除零异常: cout8/0=Div(8,0)endl; 4 异常程序说明 4 异常程序说明(续) 程序说明 在VC6环境中,为使用异常处理机制,需要进行如下的设置:ProjectSettings-Category- C++Lauguage-EnableExceptionHandling 上面程序字中异常被抛掷后,在main函数中被捕获,异常处理段输出有关信息后,程序流程跳转到主函数的最后一条语句,输出“that is ok.”,而函数中的下列语句没有被执行: cout7/1=Div(7,1)endl; 4 异常程序说明(续) 程序说明 catch处理程序的出现顺序很重要,因为在一个try块中,异常处理程序是按照它出现的顺序被检查的。只要找到一个匹配的异常类型,后面的异常处理都将被忽略。 C++异常处理块中,比较特殊的是catch(...),它可以捕获任何异常,在它首发的情况下,其它的catch语句都不被检查。因此,catch(...)应该放在最后。 4 异常程序说明(续) 5
文档评论(0)