21天学通C++-第二十章-异常处理_第1页
21天学通C++-第二十章-异常处理_第2页
21天学通C++-第二十章-异常处理_第3页
21天学通C++-第二十章-异常处理_第4页
21天学通C++-第二十章-异常处理_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二十讲:异常处理,杨章伟e-mail:jtclass,课程内容安排,错误与异常异常处理的实现类和结构的异常处理异常的处理机制综合练习思考和习题,错误与异常,简单的说,异常就是程序在运行的过程中,由于使用环境的变化以及用户的操作而产生的错误。例如,内存不足时,应用程序请求分配内存;程序中出现了以零为除数的错误;打印机未打开,导致程序运行中挂接这些设备失败等等,都会引发异常。对这些错误,应用程序如果不能进行合适的处理,将会使程序变得非常脆弱,甚至不可使用。异常处理对于编写健壮的软件来说无疑是非常重要,是否有完善的异常处理机制也会是评价某一个程序设计语言优劣的一个重要标准。,异常处理的基本思想,简单的说,异常处理的基本思想就是捕获异常后进行处理。如果程序最终没有相应的代码处理该异常,那么该异常最后被C+系统所接受,C+系统就简单地终止程序运行。异常的传递如图20-1所示。,异常处理的实现,一般来说,在C+中对异常处理的实现分为两个步骤。捕获异常处理异常,使用try/catch捕获异常,在C+中,提供了语句try/catch来捕获异常,其中,try和catch分别用于定义异常和定义异常处理。定义异常是将可能产生错误的语句放在try语句块中。其格式是:try可能产生错误的语句,捕获异常并定义处理,例如,下列语句使用try/catch捕获异常,并定义捕获后对异常的处理。trystringstr=null;/定义字符串对象ProcessString(str);/执行某个函数catch(Exceptione)/定义对异常的处理cout”Processiserror”;exit(1);/异常退出程序,使用throw抛出异常,抛出异常即检测是否产生异常,在C+中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为:throw表达式;如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。由于C+使用数据类型来区分不同的异常,因此在判断异常时,throw语句中的表达式的值就没有实际意义,而表达式的类型就特别重要。,异常处理示例,该范例给出使用try/catch语句实现捕获和处理异常,该异常是除数为0的异常。实现功能如下所示。,代码清单,1#include/包含头文件2doubleDiv(double,double);/声明函数3voidmain()45try/定义异常67cout7.3/2.0=Div(7.3,2.0)endl;8cout7.3/0.0=Div(7.3,0.0)endl;/出现异常9cout7.3/1.0=Div(7.3,1.0)endl;1011catch(double)/定义异常处理1213coutexceptionofdevidingzero.n;/输出错误信息1415coutthatisok.n;1617doubleDiv(doublea,doubleb)/定义函数1819if(b=0.0)20throwb;/抛出异常21returna/b;22,示例流程图,类和结构的异常处理,C+异常处理的真正能力不仅在于它能处理各种不同类型的异常,还在于它具有在异常抛弃前为构造的所有局部对象自动调用析构函数的能力。当在程序中找到一个匹配的catch异常处理后,如果catch()语句的异常类型声明是一个值参数,则其初始化方式是复制被抛弃的异常对象;如果catch()语句的异常类型声明是一个引用,则其初始化方式是使该引用指向异常对象。,异常处理机制,C+中的异常处理机制是一种把控制权从异常发生的地点转移到一个匹配的处理函数或功能块的机制。其中,异常可以是内建数据类型变量,也可以是对象。一般来说,异常处理机制包括四个部分:try语句块:即一个定义异常的语句块。catch语句块:即一个或多个和try语句块相关的处理,其放在catch语句块中。throw表达式:即抛出异常语句。异常本身,综合练习,下面给出一个处理文件时发生的异常实例。打开文件发生错误是经常发生的情况,那么C+是如何处理这种异常?其实现代码如下:,代码清单,1#include/包含文件打开头文件2#include/包含输入输出头文件3#include/包含库函数头文件4voidmain(intargc,char*argv)/带参数的main()函数56ifstreamsource(argv1);/打开文件7charline128;/定义字符数组8try/定义异常910if(source.fail()/打开失败11throwargv1;/抛出异常1213catch(char*s)/定义异常处理1415couterroropeningthefilesendl;/输出错误信息16exit(1);/异常退出1718while(!source.eof()/文件未结束1920source.getline(line,sizeof(line);/取出文件中内容21coutlineendl;/输出2223source.close();/关闭对象24,思考和习题,当在try块中抛出异常后,程序最后是否回到try块中,继续执行后面的语句?为什么要有异常重新抛出?异常重新抛出与处理的次序及过程是怎样的?为什么C+要求资

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论