C教案3异常处理_第1页
C教案3异常处理_第2页
C教案3异常处理_第3页
C教案3异常处理_第4页
全文预览已结束

下载本文档

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

文档简介

异常处理

15.1引入异常处理

15.2异常处理

♦:♦程序员在编写程序的过程中,为了保证软件的正确性,这就要求程序具有一定的容错能力。

也就是说,不仅在数据正确的时候,软件能够良好的运行,但在出现意外、数据错误或操作

不当的情况下,也应该有正确合理的表现,以便给程序的开发者或软件的使用者得到提示。

所以程序在开发的过程中就要充分考虑到出现的各种意外情况,并给予恰当的处理。这就是

所说的异常处理机制。本章介绍C++异常处理。程序使用iry、throw和calch语句来支持异

常处理。

♦:♦重点内容:异常处理的过程,

♦:♦难点内容:用类的方法完成异常处理。

15.1引入异常处理

程序的错误,一种是编译的错误,如果使用了错误的语法、函数、结构体和类,程序就无法

通过编译,无法生成运行代码。另一种是在运行时发生的错误,它分为不可预料的逻辑错误

和可以预料的运行异常。

逻辑错误是由于不当的设计造成的,如某个排序凫法不合适,导致在边界条件下,不能正确

完成排序的任务。就像大战之后残留的地雷,在“一切正常”中,突然进入误区,程序就会发

生“爆炸”。一旦发现逻辑错误,专门为其编写一段处理错误的代码,就可以避免错误的发生。

可以预料的运行异常,但不能避免它,因为这是由系统运行环境造成的。例如内存不足,而

程序运行中分配申请时,得不到满足就会发生异常:在硬盘上的文件被删除或移动,导致程

序运行中文件打不开而发生异常;程序中发生除数为0的代码,导致程序除0中断;打印机

没有打开、调制解调器掉线,从而导致程序中挂接这些设备失败等等。异常的任务就是允许

用户排除错误,或者至少能给出适当的出错提示信息,否者程序就会变得很脆弱。通常情况

下加入一些预防错误的代码便可防止这些异常。

如,对文件打开的保护:

#include<iostream>

#includc<fstrcam>

voidfun(*str)

(

ofstreamoutfile;

if(!outfie.open(str,ios::out))

(

cerrvv"不能打开文件!”;

exit(l);

)

else

I

基于这个思想,C++把异常处理的工作分成了检查(try)、异常抛出(throw)及异常捕获(catch)

三个部分。下面结合实例讲解一下异常处理的过程。

15.2异常处理

结合卜.面的例子我们对异常处理的过程做一卜解释。

【例15.1】从键盘上输入两个数据,求两个数据的商。先写出没有异常处理的程序。

#include<iostrcani>

usingnamespacestd;

doubledivide(doublex,doubley)

returnx/y;

voidmain()

floata,b;

whilccin»a»b;

cout«divide(a,b);

运行情况如下:

122〃从键盘上输入数据12和2给a,b赋值

6〃得到的商

143〃从键盘上输入数据14和3给a,b赋值

4.66667〃得到的商

II0〃从键盘上输入数据11和0给a,b赋值

l.#INF〃得到一个位置的数据或错误数据

在输入【22数据得出正确的结果6,再输入143也得出正确的结果4.66667,当输入

11()时,程序输出

l.#INFo从使用者的角度看,是出现了一个未知的错误。因为除数为。显然是不合适的。

现在修改程序,在函数divide中对除数进行检查,如果除数是0,就给出一个异常信息。在

主函数中通过try-catch块调用divide函数,检测有无异常信息,并做相应的处理。修改程序

如下:

【例15.2】从键盘上输入两个数据,求两个数据的商。异常处理的程序。

#include<iostream>

usingnamespacestd;

doubledivide(doublex,doubley)

if(y==O)

throwy;

returnx/y;

voidmain()

floata,b;

try

(

whiie(cin»a»b)

(

cout«divide(a.b);

cout«endl;

}

)

catch(double)

{

coutvv"除数不可以为C"«cndl;

异常实现的过程如下:

(1)将那些可能产生错误或者异常的语句或程序段放到iry块中。

(2)将异阳处理的语句放到caich块中,以便异常被传递过来进行处理。

(3)检查是否发生异常,若发生异常,则抛出异常,否则程序正常执行。

结合上例我们未分析一下执行的过程。

当我们输入110的时候,抛出了一个异常“除数不可以为0”。

当调用divide函数表达式:divide(11,0)时程序的流程控制转向divide。内执行,这是y==0

为逻辑真,除数为0在数学上是没有意义的,所以程序中定义为异常。

由于发生了异常,函数divide被退栈处理。异常被

catch(double)

coutvv"除数不可以为C"«cndl;

)

所捕获,执行完异常处理,程序中再无语句执行,结束程序的央行。

所捕获,执行完异常处理,程序中再无语句执行,结束程序的次行。

如果程序不发生异常,程序在执行完try语句块之后,结束程序的执行。

下面给出异常处理的一般语法:

(1)throw语句一般形式为:

throw操作数;

ihrow的操作数可以是任意类型。如果操作数是一个对象,则称为异常对象,Ihrow也可以抛

出一个结果为任何类型的表达式而不是对象。而catch则用来捕捉异常信息,如果捕捉到了

异常信息,就处理它。

(2)try-catch的形式为:

try

{被检查的语句}

catch(异常处理类型[变量名]){进行异常处理的语句}

catch(异常处理类型|变量名|){进行异常处理的语句}

catch处理器定义了自己处理的异常范围。catch在括号中指定要波或的参数的类型以及参数

名。catch处理器中的参数名是可选的。如果给出/参数名,则可以在处理器中引用这个参

数名。如果没有指定参数名,只指定匹配抛出的类型,则信息不从抛出点传递到处理器中,

而只是把控制从抛出点转到处理器中。许多异常都可以这样,如果某个异常处理器要捕捉所

有异常,可以“…”代替捕获的类型和参数名。如:

catch(...)

可以捕捉任意类型的异常。如果try块没有抛出异常,则执行完try块的最后一个语句,跳

过caich处理器,执行所有caich后的语句。如果iry块抛出了异常,则跳出“块,开始异

常捕捉。先将抛出的异常与第一个异常处理器比较,如果可以匹配,则执行异常处理代码,

然后转到所有catch后的语句继续执行。如果不匹配,则与下一异常处理器比较,直到找到

一个匹配的处理器。如果找遍了所有的异常处理器,都不匹配,则函数执行结束,并将该异

常抛给调用它的函数,由调用函数来处理该异常。

【例15.3】从键盘上输入两个数据,求两个数据的商。用类的方法做异常处理的程序。

#include<iostrcam>

usingnamespacestd;

classZeroException{

public:

ZeroException():mesg("除数不可以为0!")()

constchar*ExccptionMsg()const{returnm

温馨提示

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

评论

0/150

提交评论