




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章异常处理 面向对象技术与VisualC 第8章 2 本章主要内容 异常处理概述异常处理的语法应用实例 面向对象技术与VisualC 第8章 3 异常处理概述 异常处理是由程序设计语言提供的运行时刻错误处理的一种方式 程序运行中的有些错误是可以预料但不可避免的 这是要力争做到允许用户排除环境错误 继续运行程序 至少要给出适当的提示信息 传统错误处理方法大致可以分为返回码机制和全局变量两种 面向对象技术与VisualC 第8章 4 1 返回码机制这种处理错误的方法比较实用和简单 这也是经常采取的手段之一 对于小型的程序来说这种异常处理机制的缺点暴露不明显 对于一个需要多人开发的软件程序来说 它的弊端就非常明显 因为对于一个模块的实现者来说有的人返回值0代表错误 有的人返回值0代表正确 非0代表错误 解决方法可以用一致性的条文来控制 通常的 这些返回码就在一个公共的 h文件中以宏的形式存在 这样暂时解决了团队之间的一致性 但是这些都不是标准 兼容性太差 对于如此多的返回码要分别解释各自的意义 从调用者的角度来说 需要分别对返回码进行检查来处理异常 这样的代码往往就显得非常的臃肿 大大降低了可读性 面向对象技术与VisualC 第8章 5 2 全局变量通过用一个全局变量来表示一次操作是否成功 这个方法在多线程中就非常头痛 另外在每次处理完异常之后就要复位这个变量 如果忘记这个步骤 就会引起其他操作的误解 面向对象技术与VisualC 第8章 6 异常处理实现 C 语言提供对处理异常情况的内部支持 try throw和catch语句就是C 语言中用于实现异常处理的机制 有了C 异常处理 程序可以向更高的执行上下文传递意想不到的事件 从而使程序能更好地从这些异常事件中恢复过来 面向对象技术与VisualC 第8章 7 例8 2示例使用异常处理来处理错误 includevoidmain intdivisor dividend doublequotient try 异常测试块定义 cout dividend cout divisor if divisor 0 throwdividend 抛出异常quotient dividend double divisor cout Theresultis quotient endl 面向对象技术与VisualC 第8章 8 catch int 捕获异常 cout Thedivisoriszero worry endl cout Endofprogram endl 面向对象技术与VisualC 第8章 9 异常处理的语法 try throw catch是抛出和捕获异常的基本机制 Throw语句抛出异常 一个值 catch捕获异常 抛出一个异常后 try块会终止 转而执行catch块中的语句 catch块结束之后 会继续执行catch块之后的语句 前提是catch块中没有终止程序或者执行另外一些特殊的操作 如果try块中没有抛出异常 那么在try块结束之后 程序将从catch块之后的语句继续执行 换言之 如果没有抛出异常 catch块会被忽略 面向对象技术与VisualC 第8章 10 try块 如果在函数内直接用throw抛出一个异常 或在函数调用时抛出一个异常 将在异常抛出时退出函数 如果不想在异常抛出时退出函数 可以在函数体内创建一个特殊块用于解决程序中潜在的错误 在这个块中可以测试各种错误发生的可能性 通常称为测试块 它由关键字try引导 其定义格式如下 try 面向对象技术与VisualC 第8章 11 抛出异常 通常将抛出的值直接称为一个异常 所以执行throw语句就称为抛出异常 可以抛出任意类型的一个值 其定义的格式如下 throw执行throw语句时 外围的try块就会停止执行 如果try块之后跟有一个合适的catch块 那么控制权就会转交给那个catch块 一般说来 throw语句几乎肯定要嵌入一个分支语句 比如if语句 中 面向对象技术与VisualC 第8章 12 捕获异常 抛出一个异常后 外围的try块会停止执行 并开始执行另一个部分的语句 也就是catch块 执行catch的过程称为捕获异常或者异常处理 一个异常被抛出以后 最终应该由某个catch块来处理 面向对象技术与VisualC 第8章 13 一般说来 catch块参数主要完成两件事情 catch块参数前要加一个类型名 表示catch块可以捕获什么类型的异常抛出值 catch块参数为捕获的异常抛出值指定了一个名称 所以在catch块中 又可以对这个异常抛出值进行相应的处理 面向对象技术与VisualC 第8章 14 catch块的语法定义如下 catch type namevariable name 需要注意的是 如果try块中没有异常被抛出 那么在try块正常结束后 程序从catch块之后的语句继续执行 换言之 如果没有抛出异常 catch块会被忽略 面向对象技术与VisualC 第8章 15 还可以定义一个能捕获任意类型的异常的处理器 catch cout anexceptionwasthrom endl 可捕获所有的异常 同时就不能有参数 因此不可能知道所接收到得异常为何种类型 面向对象技术与VisualC 第8章 16 例8 3示例捕捉多个异常 include includeclassNegativenumber public Negativenumber Negativenumber char take it to catch block char get message private charmessage 30 面向对象技术与VisualC 第8章 17 classDividebyzero 定义异常类intmain intdividend divisor doubleportion try cout dividend if dividend divisor if divisor 0 throwNegativenumber divisor if divisor 0 portion dividend double divisor elsethrowDividebyzero cout Theresultis portion endl 面向对象技术与VisualC 第8章 18 catch Negativenumbere cout Cannothaveanegativenumberof e get message endl catch Dividebyzero cout Thedivisoriszero worry endl cout Endofprogram endl return1 面向对象技术与VisualC 第8章 19 Negativenumber Negativenumber Negativenumber Negativenumber char take it to catch block strcpy message take it to catch block char Negativenumber get message returnmessage 说明 ClassDividebyzero 这个异常类没有成员变量和成员函数 但它很有用 抛出Dividebyzero类的一个对象 会激活相应的catch块 面向对象技术与VisualC 第8章 20 ClassDividebyzero 这个异常类没有成员变量和成员函数 但它很有用 抛出Dividebyzero类的一个对象 会激活相应的catch块 面向对象技术与VisualC 第8章 21 8 2 2异常处理中的构造与析构1 C 异常处理的真正能力 不仅在于它能够处理各种不同类型的异常 还在于它具有为异常抛投前构造的所有局部对象自动调用析构函数的能力 2 如果catch子句的异常类型声明是一个值参数 则其初始化方式是复制被抛投的异常对象 如果catch子句的异常类型声明是一个引用 则其初始化方式是使该引用指向异常对象 3 将从对应的try块开始到异常被抛投之间构造 且尚未析构 的所有自动对象进行析构 面向对象技术与VisualC 第8章 22 例异常处理时的析构 includevoidMyFunc void classExpt public Expt Expt constchar ShowReason const return Expt类异常 classDemo public Demo Demo Demo Demo cout 构造Demo endl Demo Demo cout 析构Demo endl voidMyFunc DemoD cout 在MyFunc 中抛掷Expt类异常 endl throwExpt intmain cout 在main函数中 endl try cout 在try块中 调用MyFunc endl MyFunc catch ExptE cout 在catch异常处理程序中 endl cout 捕获到Expt类型异常 cout E ShowReason endl catch char str cout 捕获到其它的异常 str endl cout 回到main函数 从这里恢复执行 endl return0 程序运行时输出 在main函数中 在try块中 调用MyFunc 构造Demo 在MyFunc 中抛掷Expt类异常 析构Demo 在catch异常处理程序中 捕获到Expt类型异常 Expt类异常 回到main函数 从这里恢复执行 面向对象技术与VisualC 第8章 27 例8 4示例处理不同类型的异常 要求可以触发不同类型异常并显示抛出异常时的程序执行情况 includeclassCExcept public CExcept intExcode m Excode Excode intGetExcode returnm Excode private intm Excode 面向对象技术与VisualC 第8章 28 voidmain charch try cout ch if ch y ch Y throw Errordescription cout ch if ch y ch Y throw1 面向对象技术与VisualC 第8章 29 cout ch if ch y ch Y throwCExcept 5 cout ch if ch y ch Y throw3 1416 cout Atendoftryblock noexceptionthrown endl 面向对象技术与VisualC 第8章 30 catch char errorMsg cout char exceptionthrown exceptionmessage cout errorMsg endl catch intErrorCode cout i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆理工大学《医学放射生物学》2023-2024学年第一学期期末试卷
- 四川省泸州市泸县第一中学2025年高三月考试题(二)物理试题试卷含解析
- 江西青年职业学院《体育概述》2023-2024学年第二学期期末试卷
- 毛坯房装修流程图
- 枣强中学高二下学期期末考试生物试题
- 2025年新风系统安装施工合同
- 2025年劳动合同终止后档案应归何处
- 2025皮革购销合同模板
- 2025华服厂借款合同范本
- 2025年度其他贸易合同-地方储备油品调拨销售合同
- 辽宁省协作校2024-2025学年高二化学下学期期中试题
- 埋地塑料排水管道施工
- 劳工及道德体系法律法规清单
- 初中物理中考实验题总汇
- 2024年郑州轨道工程职业学院单招职业适应性测试题库附答案
- 2023-2024年携程入出境游消费趋势洞察报告-携程研究院-202405
- 部编版二年级语文下册第一单元大单元整体作业设计
- 2023年1月自考00808商法试题及答案含解析
- 智慧工厂驾驶舱系统建设方案
- 仓库货架的选择与布局
- 汽车静态感知质量培训课件
评论
0/150
提交评论