网站大量收购独家精品文档,联系QQ:2885784924

第12章异常处理讲解.ppt

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第12章 异常处理 主要内容 异常处理概述 C++语言中的异常处理 异常的抛出 异常的捕获及处理 标准库异常类 异常说明 1、异常处理概述 程序终止 执行正常结束而终止 程序执行中发生错误或特殊事件而终止(异常终止) 异常处理(exception handling)机制的基本思想 采用结构化方法对程序的运行时错误进行显式管理 处理的是可预料的错误或特殊事件 将程序中的正常处理代码与异常处理代码显式区别开来,提高程序的可读性 2、C++语言中的异常处理 基本思想 将异常检测与异常处理分离:异常检测部分检测到异常的存在时,抛出一个异常对象给异常处理代码,通过该异常对象,独立开发的异常检测部分和异常处理部分能够就程序执行期间所出现的异常情况进行通信 2、C++语言中的异常处理(续) 实现模式 2、C++语言中的异常处理(续) 执行机制 若有异常则通过throw操作创建一个异常对象并抛出 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try块,然后执行try子块内的保护段 如果在保护段执行期间没有引发异常,那么跟在try子块后的catch子句就不执行。程序继续执行紧跟在try块中最后一个catch子句后面的语句 catch子句按其在try块后出现的顺序被检查。类型匹配的catch子句将捕获并处理异常(或继续抛出异常) 如果找不到匹配的处理代码,则自动调用标准库函数terminate,其默认功能是调用abort( )终止程序 例1:参数异常的处理 例1:参数异常的处理 2、C++语言中的异常处理(续) 一般形式: throw 表达式; throw; //用于重新抛出异常 用于抛出异常 表达式类型可为任意内置类型或用户自定义类型 执行throw语句时,首先创建被抛出对象的副本,然后将该对象副本传递到异常处理代码所在的位置(即某个catch子句的位置) 2、C++语言中的异常处理(续) 一般形式: try { program-statements //程序的正常处理逻辑 } catch (exception-declaration) { handler-statements //异常处理代码 } ... 用于捕获并处理异常 包含一个由try引导的子块以及若干个由catch引导的子块 异常声明可以是单个类型名、单个对象声明或者为…(英文省略号) 2、C++语言中的异常处理(续) 如果执行try子块中的代码导致抛出异常,则在catch子句中搜索相应的异常处理代码 搜索时使用被抛出异常对象的类型与catch子句异常声明中的类型进行比较 异常类型的“匹配”: 被抛出异常的类型与catch子句异常声明中的类型相同 被抛出异常的类型是catch子句异常声明中的类型的子类型(即公有派生类) 注意:将对应派生类类型的处理代码放在对应基类类型的处理代码之前 2、C++语言中的异常处理(续) 使用异常声明为省略号的catch子句catch(...) { //… } 省略号表示与任意异常类型均可匹配 注意:如果try块中还有其他catch子句,则catch(...)子句必须放在最后 2、C++语言中的异常处理(续) 抛出该catch子句原来所捕获的异常,由函数调用链中更上层的函数来处理该异常 2、C++语言中的异常处理(续) 2、C++语言中的异常处理(续) 例2中的函数调用关系 2、C++语言中的异常处理(续) 使用目的 捕获及处理在处理构造函数的初始化式时可能发生的异常 同时亦可捕获及处理因执行构造函数的函数体而抛出的异常 一般形式: constructor_name (parameter_list) try : initializer_list { constructor_body } catch (exception-declaration) { exception_handler } ... 2、C++语言中的异常处理(续) 栈展开:沿着函数调用链向上搜索异常处理代码的过程 栈展开过程中,当一个函数因异常而提前终止时,编译器将自动撤销该函数中在异常发生之前创建的所有自动对象,并释放相应内存 存在的问题 在异常发生时,如果某局部自动对象的构造函数尚未执行完毕,则编译器将不会自动调用该对象的析构函数 如果在某个代码块中直接分配资源,且在资源释放之前发生异常,则在栈展开期间不会释放该资源 对策 针对创建对象时发生的异常,提供相应的异常处理代码,在其中适当地撤销已构造的成员并释放所占用的资源。 针对因资源的直接分配所造成的问题,则定义一个资源管理类来封装资源的分配和释放,在该类的构造函数中分配资源,而在该类的析构函数中释放资源 2、C++语言中的异常处理(续) 对于直接内存分配,若在

文档评论(0)

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

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

1亿VIP精品文档

相关文档