c程序设计《异常处理》

上传人:san****019 文档编号:71603097 上传时间:2019-01-21 格式:PPT 页数:20 大小:1.03MB
返回 下载 相关 举报
c程序设计《异常处理》_第1页
第1页 / 共20页
c程序设计《异常处理》_第2页
第2页 / 共20页
c程序设计《异常处理》_第3页
第3页 / 共20页
c程序设计《异常处理》_第4页
第4页 / 共20页
c程序设计《异常处理》_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《c程序设计《异常处理》》由会员分享,可在线阅读,更多相关《c程序设计《异常处理》(20页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计,异常处理,第10章 异常处理,本章学习要点,一个好的程序不仅要保证能实现所需要的功能,而且还应该有很好的容错能力。在程序运行过程中如果有异常情况出现,程序本身应该能解决这些异常,而不是死机。本章介绍异常处理的基本概念、C+异常处理语句、析构函数与异常处理。通过本章的学习,掌握了C+异常处理的机制,我们就可以在编制程序时灵活地加以运用,从而使我们编制的程序在遇到异常情况时能摆脱大的影响,避免出现死机等现象。,第10章 异常处理,10.1 异常处理的概念及C+异常处理的基本思想 10.2 异常处理的实现 10.3 学生信息管理系统中的异常处理,10.1 异常处理的概念及C+异常处理的

2、基本思想,程序中常见的错误有两大类:语法错误和运行错误。在编译时,编译系统能发现程序中的语法错误(如关键字拼写错误,变量名未定义,语句末尾缺分号,括号不配对等),程序员通过错误提示可以进行修改。,有的程序虽然能通过编译,也能投入运行,但是在运行过程中会出现异常,得不到正确的运行结果,甚至导致程序不正常终止或出现死机现象,这些都说明程序中存在运行错误。运行错误相对来说比较隐蔽,是程序调试中的一个难点,该错误又可分为逻辑错误和运行异常两类。逻辑错误是由设计不当造成的,如对算法理解有误、在一系列计算过程中出现除数为0、数组的下标溢出等。这些错误只要我们在编程时多加留意是可以避免的。但是,运行异常是由

3、系统运行环境造成的,导致程序中内存分配、文件操作及设备访问等操作的失败,可能会造成系统运行失常并瘫痪。,在运行没有异常处理的程序时,如果运行情况出现异常,由于程序本身不能处理,程序只能终止运行。如果在程序中设置了异常处理,则在运行情况出现异常时,由于程序本身已设定了处理的方法,于是程序的流程就转到异常处理代码段处理。 需要说明的是:只要程序运行时出现与人们期望的情况不同,都可以认为是异常,并对它进行异常处理。因此,所谓异常处理是指对程序运行时出现的差错以及其他例外情况的处理。,10.2 异常处理的实现,10.2.1 异常处理语句 C+处理异常的机制由3个部分组成:检查(try)、抛出(thro

4、w)和捕捉(catch)。把需要检查的语句放在try块中,throw用来当出现异常时抛出一个异常信息,而catch则用来捕捉异常信息,如果捕捉到了异常信息,就处理它。try-throw-catch构成了C+异常处理的基本结构,形式如下: try if(表达式1) throw x1 if(表达式2) throw x2 if(表达式n) throw xn ,catch(异常类型声明1) 异常处理语句序列 catch(异常类型声明2) 异常处理语句序列 catch(异常类型声明n) 异常处理语句序列 这里,try语句块内为需要受保护的待检测异常的语句序列,如果怀疑某段程序代码在执行时有可能发生异常,

5、就将它放入try语句块中。当这段代码的执行出现异常时,即某个if语句中的表达式的值为真时,会用其中的throw语句来抛掷这个异常。,throw语句语法: throw 表达式; throw语句是在程序执行发生了异常时用来抛掷这个异常的,其中表达式的值可以是int、float、字符串、类类型等,把异常抛掷给相应的处理者,即类型匹配的catch语句块。如果程序中有多处需要抛掷异常,应该用不同类型的操作数来互相区别。throw抛出的异常,通常是被catch语句捕获。 catch语句块是紧跟在try语句块后面的,即try块和catch块作为一个整体出现,catch块是try-catch结构中的一部分,必

6、须紧跟在try块之后,不能单独使用,在二者之间也不能插入其他语句。但是在一个try-catch结构中,可以只有try块而无catch块。即在本函数中只检查而不处理,把catch块放在其他函数中。一个try-catch结构中只能有一个try块,但却可以有多个catch块,以便与不同类型的异常信息匹配。在执行try块中的语句时如果出现异常执行了throw语句,系统会根据throw抛出的异常信息类型按catch块出现的次序,依次检查每个catch参数表中的异常声明类型与抛掷的异常信息类型是否匹配,当匹配时,该catch块就捕获这个异常,执行catch块中的异常处理语句来处理该异常。,在catch参数

7、表中,一般只写异常信息的类型名, 如:catch(double)。 系统只检查所抛掷的异常信息类型是否与catch参数表中的异常声明类型相匹配,而不检查它们的值。假如变量a,b,c都是int型,即使它们的值不同,在throw语句中写throw a、throw b或throw c的作用也均是相同的。因此,如果需要检测多个不同的异常信息,应当由throw抛出不同类型的异常信息。 异常信息类型可以是C+系统预定义的标准类型,也可以是用户自定义的类型(如结构体或类)。如果由throw抛出的异常信息属于该类型或其子类型,则catch与throw二者匹配,catch捕获该异常信息。注意:系统在检查异常信息

8、数据类型的匹配时,不会进行数据类型的默认转换,只有与所抛掷的异常信息类型精确匹配的catch块才会捕获这个异常。,在catch参数表中,除了指定异常信息的类型名外,还可以指定变量名,如:catch(double d)。 此时,如果throw抛出的异常信息是double型的变量a,则catch在捕获异常信息a的同时,还使d获得a的值。如果我们希望在捕获异常信息时,还能利用throw抛出的异常信息的值,这时就需要在catch参数表中写出变量名。如: catch(double d) cout“throw “d; 这时会输出d的值(也就是a值)。当抛出的是类对象时,有时希望在catch块中显示该对象中

9、的某些信息。 课本326页【例10-1】求解一元二次方程ax2+bx+c=0。,现在结合程序分析异常处理的进行情况。 (1)首先在try后面的花括号中放置上可能出现异常的语句块或程序段。 (2) 程序运行时将按正常的顺序执行到try块,执行try块中花括号内的语句。如果在执行try块内的语句过程中没有发生异常,则忽略所有的catch块,流程转到catch块后面的语句继续执行。如【例10-1】运行情况的第种情况。 (3)如果在执行try块内的语句过程中发生异常,则由throw语句抛出一个异常信息。throw语句抛出什么样的异常由程序设计者自定,可以是任何类型的异常,在【例10-1】中抛出了整型和

10、字符串类型的异常。,(4) 这个异常信息提供给try-catch结构,系统会寻找与之匹配的catch块。如果某个catch参数表中的异常声明类型与抛掷的异常类型相匹配,该catch块就捕获这个异常,执行catch块中的异常处理语句来处理该异常。只要有一个catch块捕获了异常,其余的catch块都将被忽略。如【例10-1】运行情况的第种情况,由try块内的throw语句抛掷一个整型异常,被第一个catch块捕获。【例10-1】运行情况的第种情况,由try块内的throw语句抛掷一个字符串类型异常,被第二个catch块捕获。 当然,异常类型可以声明为省略号(),表示可以处理任何类型的异常。需要说

11、明的是,catch()语句块应该放在最后面,因为如果放在前面,它可以用来捕获任何异常,那么后面其他的catch语句块就不会被检查和执行了。,(5)在进行异常处理后,程序并不会自动终止,继续执行catch块后面的语句。 (6)如果throw抛掷的异常信息找不到与之匹配的catch块,则系统就会调用一个系统函数terminate,在屏幕上显示“abnormal program termination”,并终止程序的运行。 (7)抛掷异常信息的throw语句可以与try-catch结构出现在同一个函数中,也可以不出现在同一函数中。在这种情况下,当throw抛出异常信息后,首先在本函数中寻找与之匹配的

12、catch块,如果在本函数中无try-catch结构或找不到与之匹配的catch块,就转到离开出现异常最近的try-catch结构去处理。上面【例10-1】的程序可以修改为课本328页中例题:,(8)异常处理还可以应用在函数嵌套的情况下。下面以课本329页【例10-2】为例观察在函数嵌套情况下异常检测的处理情况,了解程序执行顺序。,10.2.2 在函数声明中进行异常情况指定 为便于阅读程序,使用户在看程序时能够知道所用的函数是否会抛出异常信息以及抛出的异常信息的类型,C+允许在函数声明时指定函数抛出的异常信息的类型,如: double jie(double, double, double) t

13、hrow(double); 表示jie()函数只能抛出double类型的异常信息。如果写成: double jie(double, double, double) throw(int, float, double, char); 则表示jie()函数可以抛出int,float,double或char类型的异常信息。异常指定是函数声明的一部分,必须同时出现在函数声明和函数定义的首行中,否则编译时,编译系统会报告“类型不匹配”。,如果在函数声明时不指定函数抛出的异常信息的类型,则该函数可以抛出任何类型的异常。例如: int fun(int,char); /函数fun()可以抛出任何异常 如果在函数

14、声明时指定throw参数表为不包括任何类型的空表,则不允许函数抛出任何异常。如: int fun(int,char) throw(); /不允许抛出任何异常 这时即使在函数中出现了throw语句,实际上在函数执行出现异常时也并不执行throw语句,并不抛出任何异常信息,程序将非正常终止。,10.2.3 析构函数与异常 如果类对象是在try块(或try块中调用的函数)中定义的,在执行try块 (包括在try块中调用其他函数) 的过程中如果发生了异常,此时流程立即离开try块(如果是在try块调用的函数中发生异常,则流程首先离开该函数,回退到调用该函数的try-catch结构的catch块处)。这

15、样流程就有可能离开该对象的作用域而转到其他函数,所以应当事先做好结束对象前的清理工作,C+的异常处理机制会在throw抛出异常信息被catch捕获时,对有关的局部对象调用析构函数,然后再执行与异常信息匹配的catch块中的语句。看课本332页【例10-3】类AA的私有数据成员a赋值空间是小于等于100的数,如果赋值大于100会产生异常,此时释放类A的对象空间,执行返回而结束运行。,10.3 学生信息管理系统中的异常处理,在学生信息管理系统中,异常处理是经常要用到的,如当输入的学生信息中有错误,不符合条件(输入的学生学号为0或负数)时,就要用到异常处理。下面举一个简单的例子来分析一下,示例程序对学生信息管理系统中的相应语句做了简化,将与异常处理无关的内容做了删除。 课本334页中【例10-4】在学生信息管理系统中,当输入错误数据时,进行异常处理。,Thank You !,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号