C程序设计《异常处理》ppt课件_第1页
C程序设计《异常处理》ppt课件_第2页
C程序设计《异常处理》ppt课件_第3页
C程序设计《异常处理》ppt课件_第4页
C程序设计《异常处理》ppt课件_第5页
已阅读5页,还剩15页未读, 继续免费阅读

下载本文档

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

文档简介

1、C+程序设计 异常处置异常处置第第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用来当出现异常时抛出一个异常信息,而用来当出现异常时抛出一个异常信息,而catch那么用来那么用来捕

7、捉异常信息,假设捕捉到了异常信息,就处置它。捕捉异常信息,假设捕捉到了异常信息,就处置它。try-throw-catch构成了构成了C+异常处置的根本构造,方式如下:异常处置的根本构造,方式如下:try if(表达式表达式1) throw x1if(表达式表达式2) throw x2if(表达式表达式n) throw xncatch异常类型声明异常类型声明1 异常处置语句序列异常处置语句序列 catch异常类型声明异常类型声明2 异常处置语句序列异常处置语句序列 catch异常类型声明异常类型声明n 异常处置语句序列异常处置语句序列 这里,这里,try语句块内为需求受维护的待检测异常的语句语句

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

9、串、类类型等,把异常抛掷、字符串、类类型等,把异常抛掷给相应的处置者,即类型匹配的给相应的处置者,即类型匹配的catch语句块。假设程序中有多处语句块。假设程序中有多处需求抛掷异常,应该用不同类型的操作数来相互区别。需求抛掷异常,应该用不同类型的操作数来相互区别。throw抛出抛出的异常,通常是被的异常,通常是被catch语句捕获。语句捕获。catch语句块是紧跟在语句块是紧跟在try语句块后面的,即语句块后面的,即try块和块和catch块作为块作为一个整体出现,一个整体出现,catch块是块是try-catch构造中的一部分,必需紧跟在构造中的一部分,必需紧跟在try块之后,不能单独运用,

10、在二者之间也不能插入其他语句。但是块之后,不能单独运用,在二者之间也不能插入其他语句。但是在一个在一个try-catch构造中,可以只需构造中,可以只需try块而无块而无catch块。即在本函数块。即在本函数中只检查而不处置,把中只检查而不处置,把catch块放在其他函数中。一个块放在其他函数中。一个try-catch构构造中只能有一个造中只能有一个try块,但却可以有多个块,但却可以有多个catch块,以便与不同类型块,以便与不同类型的异常信息匹配。在执行的异常信息匹配。在执行try块中的语句时假设出现异常执行了块中的语句时假设出现异常执行了throw语句,系统会根据语句,系统会根据thro

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

12、相匹配,而不检查它们的值。数表中的异常声明类型相匹配,而不检查它们的值。假设变量假设变量a,b,c都是都是int型,即使它们的值不同,在型,即使它们的值不同,在throw语句中写语句中写throw a、throw b或或throw c的作用也的作用也均是一样的。因此,假设需求检测多个不同的异常信均是一样的。因此,假设需求检测多个不同的异常信息,该当由息,该当由throw抛出不同类型的异常信息。抛出不同类型的异常信息。异常信息类型可以是异常信息类型可以是C+系统预定义的规范类型,系统预定义的规范类型,也可以是用户自定义的类型也可以是用户自定义的类型(如构造体或类如构造体或类)。假设由。假设由th

13、row抛出的异常信息属于该类型或其子类型,那么抛出的异常信息属于该类型或其子类型,那么catch与与throw二者匹配,二者匹配,catch捕获该异常信息。留捕获该异常信息。留意:系统在检查异常信息数据类型的匹配时,不会进意:系统在检查异常信息数据类型的匹配时,不会进展数据类型的默许转换,只需与所抛掷的异常信息类展数据类型的默许转换,只需与所抛掷的异常信息类型准确匹配的型准确匹配的catch块才会捕获这个异常。块才会捕获这个异常。在在catch参数表中,除了指定异常信息的类型名外,还参数表中,除了指定异常信息的类型名外,还可以指定变量名,如:可以指定变量名,如:catch(double d)。

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

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

16、,流程转到catch块后面的语句继续执行。块后面的语句继续执行。如【例如【例10-1】运转情况的第种情况。】运转情况的第种情况。v3假设在执行假设在执行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语句块就不会被检查和执行语句块就不会被检查和执行了。了。v5在进展异常处置后,程序并不会自动终止,在进展异常处置后,

19、程序并不会自动终止,继续执行继续执行catch块后面的语句。块后面的语句。v6假设假设throw抛掷的异常信息找不到与之匹配抛掷的异常信息找不到与之匹配的的catch块,那么系统就会调用一个系统函数块,那么系统就会调用一个系统函数terminate,在屏幕上显示,在屏幕上显示“abnormal program termination,并终止程序的运转。,并终止程序的运转。v7抛掷异常信息的抛掷异常信息的throw语句可以与语句可以与try-catch构造出如今同一个函数中,也可以不出如今同一构造出如今同一个函数中,也可以不出如今同一函数中。在这种情况下,当函数中。在这种情况下,当throw抛出

20、异常信息抛出异常信息后,首先在本函数中寻觅与之匹配的后,首先在本函数中寻觅与之匹配的catch块,块,假设在本函数中无假设在本函数中无try-catch构造或找不到与之匹构造或找不到与之匹配的配的catch块,就转到分开出现异常最近的块,就转到分开出现异常最近的try-catch构造去处置。上面【例构造去处置。上面【例10-1】的程序可以】的程序可以修正为课本修正为课本328页中例题:页中例题:v8异常处置还可以运用在函数嵌套异常处置还可以运用在函数嵌套的情况下。下面以课本的情况下。下面以课本329页【例页【例10-2】为例察看在函数嵌套情况下异常检测的为例察看在函数嵌套情况下异常检测的处置情

21、况,了解程序执行顺序。处置情况,了解程序执行顺序。10.2.2 在函数声明中进展异常情况指定在函数声明中进展异常情况指定为便于阅读程序,运用户在看程序时可以知道所用的函数能为便于阅读程序,运用户在看程序时可以知道所用的函数能否会抛出异常信息以及抛出的异常信息的类型,否会抛出异常信息以及抛出的异常信息的类型,C+允许允许在函数声明时指定函数抛出的异常信息的类型,如:在函数声明时指定函数抛出的异常信息的类型,如:double jie(double, double, double) throw(double);表示表示jie()函数只能抛出函数只能抛出double类型的异常信息。假设写成:类型的异常

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

23、可以抛出任何类型的异常。例类型,那么该函数可以抛出任何类型的异常。例如:如:vint fun(int,char); /函数函数fun()可以抛出任可以抛出任何异常何异常v假设在函数声明时指定假设在函数声明时指定throw参数表为不包括任参数表为不包括任何类型的空表,那么不允许函数抛出任何异常。何类型的空表,那么不允许函数抛出任何异常。如:如:vint fun(int,char) throw(); /不允许抛出任何不允许抛出任何异常异常v这时即使在函数中出现了这时即使在函数中出现了throw语句,实践上在语句,实践上在函数执行出现异常时也并不执行函数执行出现异常时也并不执行throw语句,并语句,并不抛出任何异常信息,程序将非正常终止。不抛出任何异常信息,程序将非正常终止。10.2.3 析构函数与异常析构函数与异常假设类对象是在假设类对象是在try块块(或或try块中调用的函数块中调用的函数)中定义中定义的,在执行的,在执行try块块 (包括在包括在try块中调用其他函数块中调用其他函数) 的的过程中假设发生了异常,此时流程立刻分开过程中假设发生了异常,此时流程立刻分开try块块假设是在假设是在try块调用

温馨提示

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

最新文档

评论

0/150

提交评论