《c++程序设计》课件第10章 异常处理.ppt

上传人(卖家):momomo 文档编号:5787111 上传时间:2023-05-09 格式:PPT 页数:20 大小:873.50KB
下载 相关 举报
《c++程序设计》课件第10章 异常处理.ppt_第1页
第1页 / 共20页
《c++程序设计》课件第10章 异常处理.ppt_第2页
第2页 / 共20页
《c++程序设计》课件第10章 异常处理.ppt_第3页
第3页 / 共20页
《c++程序设计》课件第10章 异常处理.ppt_第4页
第4页 / 共20页
《c++程序设计》课件第10章 异常处理.ppt_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、C+程序设计第第10 10章章 异常处理异常处理第第10章章 异常处理异常处理本章学习要点本章学习要点一个好的程序不仅要保证能实现所需要的功能,一个好的程序不仅要保证能实现所需要的功能,而且还应该有很好的容错能力。在程序运行过程而且还应该有很好的容错能力。在程序运行过程中如果有异常情况出现,程序本身应该能解决这中如果有异常情况出现,程序本身应该能解决这些异常,而不是死机。本章介绍异常处理的基本些异常,而不是死机。本章介绍异常处理的基本概念、概念、C+异常处理语句、析构函数与异常处理。异常处理语句、析构函数与异常处理。通过本章的学习,掌握了通过本章的学习,掌握了C+异常处理的机制,异常处理的机制

2、,我们就可以在编制程序时灵活地加以运用,从而我们就可以在编制程序时灵活地加以运用,从而使我们编制的程序在遇到异常情况时能摆脱大的使我们编制的程序在遇到异常情况时能摆脱大的影响,避免出现死机等现象影响,避免出现死机等现象。第第10章章 异常处理异常处理10.1 异常处理的概念及异常处理的概念及C+异常处理的异常处理的基本思想基本思想10.2 异常处理的实现异常处理的实现10.3 学生信息管理系统中的异常处理学生信息管理系统中的异常处理10.1 异常处理的概念及异常处理的概念及C+异常处理的基本思想异常处理的基本思想v程序中常见的错误有两大类:语法错程序中常见的错误有两大类:语法错误和运行错误。在

3、编译时,编译系统误和运行错误。在编译时,编译系统能发现程序中的语法错误(如关键字能发现程序中的语法错误(如关键字拼写错误,变量名未定义,语句末尾拼写错误,变量名未定义,语句末尾缺分号,括号不配对等),程序员通缺分号,括号不配对等),程序员通过错误提示可以进行修改。过错误提示可以进行修改。v有的程序虽然能通过编译,也能投入运行,但是有的程序虽然能通过编译,也能投入运行,但是在运行过程中会出现异常,得不到正确的运行结在运行过程中会出现异常,得不到正确的运行结果,甚至导致程序不正常终止或出现死机现象,果,甚至导致程序不正常终止或出现死机现象,这些都说明程序中存在运行错误。运行错误相对这些都说明程序中

4、存在运行错误。运行错误相对来说比较隐蔽,是程序调试中的一个难点,该错来说比较隐蔽,是程序调试中的一个难点,该错误又可分为逻辑错误和运行异常两类。逻辑错误误又可分为逻辑错误和运行异常两类。逻辑错误是由设计不当造成的,如对算法理解有误、在一是由设计不当造成的,如对算法理解有误、在一系列计算过程中出现除数为系列计算过程中出现除数为0、数组的下标溢出、数组的下标溢出等。这些错误只要我们在编程时多加留意是可以等。这些错误只要我们在编程时多加留意是可以避免的。但是,运行异常是由系统运行环境造成避免的。但是,运行异常是由系统运行环境造成的,导致程序中内存分配、文件操作及设备访问的,导致程序中内存分配、文件操

5、作及设备访问等操作的失败,可能会造成系统运行失常并瘫痪。等操作的失败,可能会造成系统运行失常并瘫痪。v在运行没有异常处理的程序时,如果运行在运行没有异常处理的程序时,如果运行情况出现异常,由于程序本身不能处理,情况出现异常,由于程序本身不能处理,程序只能终止运行。如果在程序中设置了程序只能终止运行。如果在程序中设置了异常处理,则在运行情况出现异常时,由异常处理,则在运行情况出现异常时,由于程序本身已设定了处理的方法,于是程于程序本身已设定了处理的方法,于是程序的流程就转到异常处理代码段处理。序的流程就转到异常处理代码段处理。v需要说明的是:只要程序运行时出现与人需要说明的是:只要程序运行时出现

6、与人们期望的情况不同,都可以认为是异常,们期望的情况不同,都可以认为是异常,并对它进行异常处理。因此,所谓异常处并对它进行异常处理。因此,所谓异常处理是指对程序运行时出现的差错以及其他理是指对程序运行时出现的差错以及其他例外情况的处理。例外情况的处理。10.2 异常处理的实现异常处理的实现10.2.1 异常处理语句异常处理语句C+处理异常的机制由处理异常的机制由3个部分组成:检查(个部分组成:检查(try)、抛出)、抛出(throw)和捕捉()和捕捉(catch)。把需要检查的语句放在)。把需要检查的语句放在try块中,块中,throw用来当出现异常时抛出一个异常信息,而用来当出现异常时抛出一

7、个异常信息,而catch则用来捕则用来捕捉异常信息,如果捕捉到了异常信息,就处理它。捉异常信息,如果捕捉到了异常信息,就处理它。try-throw-catch构成了构成了C+异常处理的基本结构,形式如下:异常处理的基本结构,形式如下:try if(表达式表达式1)throw x1if(表达式表达式2)throw x2if(表达式表达式n)throw xncatch(异常类型声明(异常类型声明1)异常处理语句序列异常处理语句序列 catch(异常类型声明(异常类型声明2)异常处理语句序列异常处理语句序列 catch(异常类型声明(异常类型声明n)异常处理语句序列异常处理语句序列 这里,这里,tr

8、y语句块内为需要受保护的待检测异常的语句语句块内为需要受保护的待检测异常的语句序列,如果怀疑某段程序代码在执行时有可能发生序列,如果怀疑某段程序代码在执行时有可能发生异常,就将它放入异常,就将它放入try语句块中。当这段代码的执行语句块中。当这段代码的执行出现异常时,即某个出现异常时,即某个if语句中的表达式的值为真时,语句中的表达式的值为真时,会用其中的会用其中的throw语句来抛掷这个异常。语句来抛掷这个异常。throw语句语法:语句语法:throw 表达式表达式;throw语句是在程序执行发生了异常时用来抛掷这个异常的,其语句是在程序执行发生了异常时用来抛掷这个异常的,其中表达式的值可以

9、是中表达式的值可以是int、float、字符串、类类型等,把异常抛掷、字符串、类类型等,把异常抛掷给相应的处理者,即类型匹配的给相应的处理者,即类型匹配的catch语句块。如果程序中有多处语句块。如果程序中有多处需要抛掷异常,应该用不同类型的操作数来互相区别。需要抛掷异常,应该用不同类型的操作数来互相区别。throw抛出抛出的异常,通常是被的异常,通常是被catch语句捕获。语句捕获。catch语句块是紧跟在语句块是紧跟在try语句块后面的,即语句块后面的,即try块和块和catch块作为块作为一个整体出现,一个整体出现,catch块是块是try-catch结构中的一部分,必须紧跟在结构中的一

10、部分,必须紧跟在try块之后,不能单独使用,在二者之间也不能插入其他语句。但是块之后,不能单独使用,在二者之间也不能插入其他语句。但是在一个在一个try-catch结构中,可以只有结构中,可以只有try块而无块而无catch块。即在本函数块。即在本函数中只检查而不处理,把中只检查而不处理,把catch块放在其他函数中。一个块放在其他函数中。一个try-catch结结构中只能有一个构中只能有一个try块,但却可以有多个块,但却可以有多个catch块,以便与不同类型块,以便与不同类型的异常信息匹配。在执行的异常信息匹配。在执行try块中的语句时如果出现异常执行了块中的语句时如果出现异常执行了thr

11、ow语句,系统会根据语句,系统会根据throw抛出的异常信息类型按抛出的异常信息类型按catch块出现块出现的次序,依次检查每个的次序,依次检查每个catch参数表中的异常声明类型与抛掷的异参数表中的异常声明类型与抛掷的异常信息类型是否匹配,当匹配时,该常信息类型是否匹配,当匹配时,该catch块就捕获这个异常,执块就捕获这个异常,执行行catch块中的异常处理语句来处理该异常。块中的异常处理语句来处理该异常。在在catch参数表中,一般只写异常信息的类型名,参数表中,一般只写异常信息的类型名,如:如:catch(double)。系统只检查所抛掷的异常信息类型是否与系统只检查所抛掷的异常信息类

12、型是否与catch参参数表中的异常声明类型相匹配,而不检查它们的值。数表中的异常声明类型相匹配,而不检查它们的值。假如变量假如变量a,b,c都是都是int型,即使它们的值不同,在型,即使它们的值不同,在throw语句中写语句中写throw a、throw b或或throw c的作用也的作用也均是相同的。因此,如果需要检测多个不同的异常信均是相同的。因此,如果需要检测多个不同的异常信息,应当由息,应当由throw抛出不同类型的异常信息。抛出不同类型的异常信息。异常信息类型可以是异常信息类型可以是C+系统预定义的标准类型,系统预定义的标准类型,也可以是用户自定义的类型也可以是用户自定义的类型(如结

13、构体或类如结构体或类)。如果由。如果由throw抛出的异常信息属于该类型或其子类型,则抛出的异常信息属于该类型或其子类型,则catch与与throw二者匹配,二者匹配,catch捕获该异常信息。注捕获该异常信息。注意:系统在检查异常信息数据类型的匹配时,不会进意:系统在检查异常信息数据类型的匹配时,不会进行数据类型的默认转换,只有与所抛掷的异常信息类行数据类型的默认转换,只有与所抛掷的异常信息类型精确匹配的型精确匹配的catch块才会捕获这个异常。块才会捕获这个异常。在在catch参数表中,除了指定异常信息的类型名外,还参数表中,除了指定异常信息的类型名外,还可以指定变量名,如:可以指定变量名

14、,如:catch(double d)。此时,如果此时,如果throw抛出的异常信息是抛出的异常信息是double型的变量型的变量a,则则catch在捕获异常信息在捕获异常信息a的同时,还使的同时,还使d获得获得a的值。的值。如果我们希望在捕获异常信息时,还能利用如果我们希望在捕获异常信息时,还能利用throw抛抛出的异常信息的值,这时就需要在出的异常信息的值,这时就需要在catch参数表中写参数表中写出变量名。如:出变量名。如:catch(double d)coutthrow d;这时会输出这时会输出d的值的值(也就是也就是a值值)。当抛出的是类对象时,。当抛出的是类对象时,有时希望在有时希望

15、在catch块中显示该对象中的某些信息。块中显示该对象中的某些信息。课本课本326页页【例例10-1】求解一元二次方程求解一元二次方程ax2+bx+c=0。v现在结合程序分析异常处理的进行情况。现在结合程序分析异常处理的进行情况。v(1)首先在)首先在try后面的花括号中放置上可能出现后面的花括号中放置上可能出现异常的语句块或程序段。异常的语句块或程序段。v(2)程序运行时将按正常的顺序执行到程序运行时将按正常的顺序执行到try块,块,执行执行try块中花括号内的语句。如果在执行块中花括号内的语句。如果在执行try块内块内的语句过程中没有发生异常,则忽略所有的的语句过程中没有发生异常,则忽略所

16、有的catch块,流程转到块,流程转到catch块后面的语句继续执行。块后面的语句继续执行。如如【例例10-1】运行情况的第种情况。运行情况的第种情况。v(3)如果在执行)如果在执行try块内的语句过程中发生异常,块内的语句过程中发生异常,则由则由throw语句抛出一个异常信息。语句抛出一个异常信息。throw语句抛语句抛出什么样的异常由程序设计者自定,可以是任何出什么样的异常由程序设计者自定,可以是任何类型的异常,在类型的异常,在【例例10-1】中抛出了整型和字符中抛出了整型和字符串类型的异常。串类型的异常。v(4)这个异常信息提供给这个异常信息提供给try-catch结构,系统会寻找与结构

17、,系统会寻找与之匹配的之匹配的catch块。如果某个块。如果某个catch参数表中的异常声明参数表中的异常声明类型与抛掷的异常类型相匹配,该类型与抛掷的异常类型相匹配,该catch块就捕获这个异块就捕获这个异常,执行常,执行catch块中的异常处理语句来处理该异常。只要块中的异常处理语句来处理该异常。只要有一个有一个catch块捕获了异常,其余的块捕获了异常,其余的catch块都将被忽略。块都将被忽略。如如【例例10-1】运行情况的第种情况,由运行情况的第种情况,由try块内的块内的throw语句抛掷一个整型异常,被第一个语句抛掷一个整型异常,被第一个catch块捕获。块捕获。【例例10-1】

18、运行情况的第种情况,由运行情况的第种情况,由try块内的块内的throw语句抛掷语句抛掷一个字符串类型异常,被第二个一个字符串类型异常,被第二个catch块捕获。块捕获。v 当然,异常类型可以声明为省略号(当然,异常类型可以声明为省略号(),表示可以处理),表示可以处理任何类型的异常。需要说明的是,任何类型的异常。需要说明的是,catch()语句块应)语句块应该放在最后面,因为如果放在前面,它可以用来捕获任何该放在最后面,因为如果放在前面,它可以用来捕获任何异常,那么后面其他的异常,那么后面其他的catch语句块就不会被检查和执行语句块就不会被检查和执行了。了。v(5)在进行异常处理后,程序并

19、不会自动终止,)在进行异常处理后,程序并不会自动终止,继续执行继续执行catch块后面的语句。块后面的语句。v(6)如果)如果throw抛掷的异常信息找不到与之匹配抛掷的异常信息找不到与之匹配的的catch块,则系统就会调用一个系统函数块,则系统就会调用一个系统函数terminate,在屏幕上显示,在屏幕上显示“abnormal program termination”,并终止程序的运行。,并终止程序的运行。v(7)抛掷异常信息的)抛掷异常信息的throw语句可以与语句可以与try-catch结构出现在同一个函数中,也可以不出现在同一结构出现在同一个函数中,也可以不出现在同一函数中。在这种情况

20、下,当函数中。在这种情况下,当throw抛出异常信息抛出异常信息后,首先在本函数中寻找与之匹配的后,首先在本函数中寻找与之匹配的catch块,块,如果在本函数中无如果在本函数中无try-catch结构或找不到与之匹结构或找不到与之匹配的配的catch块,就转到离开出现异常最近的块,就转到离开出现异常最近的try-catch结构去处理。上面结构去处理。上面【例例10-1】的程序可以的程序可以修改为课本修改为课本328页中例题:页中例题:v(8)异常处理还可以应用在函数嵌套)异常处理还可以应用在函数嵌套的情况下。下面以课本的情况下。下面以课本329页页【例例10-2】为例观察在函数嵌套情况下异常检

21、测的为例观察在函数嵌套情况下异常检测的处理情况,了解程序执行顺序。处理情况,了解程序执行顺序。10.2.2 在函数声明中进行异常情况指定在函数声明中进行异常情况指定v 为便于阅读程序,使用户在看程序时能够知道所用的函数为便于阅读程序,使用户在看程序时能够知道所用的函数是否会抛出异常信息以及抛出的异常信息的类型,是否会抛出异常信息以及抛出的异常信息的类型,C+允允许在函数声明时指定函数抛出的异常信息的类型,如许在函数声明时指定函数抛出的异常信息的类型,如:v double jie(double,double,double)throw(double);v 表示表示jie()函数只能抛出函数只能抛出

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

23、函数抛出的异常信息的类型,则该函数可以抛出任何类型的异常。例如:类型,则该函数可以抛出任何类型的异常。例如:vint fun(int,char);/函数函数fun()可以抛出任可以抛出任何异常何异常v如果在函数声明时指定如果在函数声明时指定throw参数表为不包括任参数表为不包括任何类型的空表,则不允许函数抛出任何异常。如:何类型的空表,则不允许函数抛出任何异常。如:vint fun(int,char)throw();/不允许抛出任何不允许抛出任何异常异常v这时即使在函数中出现了这时即使在函数中出现了throw语句,实际上在语句,实际上在函数执行出现异常时也并不执行函数执行出现异常时也并不执行

24、throw语句,并语句,并不抛出任何异常信息,程序将非正常终止。不抛出任何异常信息,程序将非正常终止。10.2.3 析构函数与异常析构函数与异常v如果类对象是在如果类对象是在try块块(或或try块中调用的函数块中调用的函数)中定中定义的,在执行义的,在执行try块块(包括在包括在try块中调用其他函数块中调用其他函数)的过程中如果发生了异常,此时流程立即离开的过程中如果发生了异常,此时流程立即离开try块(如果是在块(如果是在try块调用的函数中发生异常,则流块调用的函数中发生异常,则流程首先离开该函数,回退到调用该函数的程首先离开该函数,回退到调用该函数的try-catch结构的结构的ca

25、tch块处)。这样流程就有可能离块处)。这样流程就有可能离开该对象的作用域而转到其他函数,所以应当事先开该对象的作用域而转到其他函数,所以应当事先做好结束对象前的清理工作,做好结束对象前的清理工作,C+的异常处理机制的异常处理机制会在会在throw抛出异常信息被抛出异常信息被catch捕获时,对有关捕获时,对有关的局部对象调用析构函数,然后再执行与异常信息的局部对象调用析构函数,然后再执行与异常信息匹配的匹配的catch块中的语句。看课本块中的语句。看课本332页页【例例10-3】类类AA的私有数据成员的私有数据成员a赋值空间是小于等于赋值空间是小于等于100的的数,如果赋值大于数,如果赋值大

26、于100会产生异常,此时释放类会产生异常,此时释放类A的对象空间,执行返回而结束运行。的对象空间,执行返回而结束运行。10.3 学生信息管理系统中的学生信息管理系统中的异常处理异常处理v在学生信息管理系统中,异常处理是经常在学生信息管理系统中,异常处理是经常要用到的,如当输入的学生信息中有错误,要用到的,如当输入的学生信息中有错误,不符合条件(输入的学生学号为不符合条件(输入的学生学号为0或负数)或负数)时,就要用到异常处理。下面举一个简单时,就要用到异常处理。下面举一个简单的例子来分析一下,示例程序对学生信息的例子来分析一下,示例程序对学生信息管理系统中的相应语句做了简化,将与异管理系统中的相应语句做了简化,将与异常处理无关的内容做了删除。常处理无关的内容做了删除。v课本课本334页中页中【例例10-4】在学生信息管理系在学生信息管理系统中,当输入错误数据时,进行异常处理。统中,当输入错误数据时,进行异常处理。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《c++程序设计》课件第10章 异常处理.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|