《C面向对象程序设计》课件第8章.ppt
《《C面向对象程序设计》课件第8章.ppt》由会员分享,可在线阅读,更多相关《《C面向对象程序设计》课件第8章.ppt(62页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第14章章 C+工具工具14.1 异常处理异常处理14.2 命名空间命名空间14.3 使用早期的函数库使用早期的函数库在在C+发展的后期,有时发展的后期,有时C+编译系统根据实际工作编译系统根据实际工作的需要,增加了一些功能,作为工具来使用,其中主的需要,增加了一些功能,作为工具来使用,其中主要有模板要有模板(包括函数模板和类模板包括函数模板和类模板)、异常处理、命名、异常处理、命名空间和运行时类型识别,以帮助程序设计人员更方便空间和运行时类型识别,以帮助程序设计人员更方便地进行程序的设计和调试工作。地进行程序的设计和调试工作。1997年年ANSI C+委委员会将它们纳入了员会将它们纳入了A
2、NSI C+标准,建议所有的标准,建议所有的C+编译系统都能实现这些功能。这些工具是非常有用的,编译系统都能实现这些功能。这些工具是非常有用的,C+的使用者应当尽量使用这些工具。的使用者应当尽量使用这些工具。程序编制者不仅要考虑程序没有错误的理想情况,更程序编制者不仅要考虑程序没有错误的理想情况,更要考虑程序存在错误时的情况,应该能够尽快地发现要考虑程序存在错误时的情况,应该能够尽快地发现错误,消除错误。错误,消除错误。程序中常见的错误有两大类程序中常见的错误有两大类:语法错误和运行错误。语法错误和运行错误。在编译时,编译系统能发现程序中的语法错误。在编译时,编译系统能发现程序中的语法错误。有
3、的程序虽然能通过编译,也能投入运行。但是在运有的程序虽然能通过编译,也能投入运行。但是在运行过程中会出现异常,得不到正确的运行结果,甚至行过程中会出现异常,得不到正确的运行结果,甚至导致程序不正常终止,或出现死机现象。这类错误比导致程序不正常终止,或出现死机现象。这类错误比较隐蔽,不易被发现,往往耗费许多时间和精力。这较隐蔽,不易被发现,往往耗费许多时间和精力。这成为程序调试中的一个难点。成为程序调试中的一个难点。14.1 异常处理异常处理 14.1.1 异常处理的任务异常处理的任务在设计程序时,应当事先分析程序运行时可能出现的在设计程序时,应当事先分析程序运行时可能出现的各种意外的情况,并且
4、分别制订出相应的处理方法,各种意外的情况,并且分别制订出相应的处理方法,这就是程序的异常处理的任务。这就是程序的异常处理的任务。在运行没有异常处理的程序时,如果运行情况出现异在运行没有异常处理的程序时,如果运行情况出现异常,由于程序本身不能处理,程序只能终止运行。如常,由于程序本身不能处理,程序只能终止运行。如果在程序中设置了异常处理机制,则在运行情况出现果在程序中设置了异常处理机制,则在运行情况出现异常时,由于程序本身已规定了处理的方法,于是程异常时,由于程序本身已规定了处理的方法,于是程序的流程就转到异常处理代码段处理。用户可以指定序的流程就转到异常处理代码段处理。用户可以指定进行任何的处
5、理。进行任何的处理。需要说明,只要出现与人们期望的情况不同,都可以需要说明,只要出现与人们期望的情况不同,都可以认为是异常,并对它进行异常处理。因此,所谓异常认为是异常,并对它进行异常处理。因此,所谓异常处理指的是对运行时出现的差错以及其他例外情况的处理指的是对运行时出现的差错以及其他例外情况的处理。处理。在一个小的程序中,可以用比较简单的方法处理异常。在一个小的程序中,可以用比较简单的方法处理异常。但是在一个大的系统中,如果在每一个函数中都设置但是在一个大的系统中,如果在每一个函数中都设置处理异常的程序段,会使程序过于复杂和庞大。因此,处理异常的程序段,会使程序过于复杂和庞大。因此,C+采取
6、的办法是采取的办法是:如果在执行一个函数过程中出现如果在执行一个函数过程中出现异常,可以不在本函数中立即处理,而是发出一个信异常,可以不在本函数中立即处理,而是发出一个信息,传给它的上一级息,传给它的上一级(即调用它的函数即调用它的函数),它的上级捕,它的上级捕捉到这个信息后进行处理。如果上一级的函数也不能捉到这个信息后进行处理。如果上一级的函数也不能处理,就再传给其上一级,由其上一级处理。如此逐处理,就再传给其上一级,由其上一级处理。如此逐级上送,如果到最高一级还无法处理,最后只好异常级上送,如果到最高一级还无法处理,最后只好异常终止程序的执行。终止程序的执行。14.1.2 异常处理的方法异
7、常处理的方法这样做使异常的发现与处理不由同一函数来完成。好这样做使异常的发现与处理不由同一函数来完成。好处是使底层的函数专门用于解决实际任务,而不必再处是使底层的函数专门用于解决实际任务,而不必再承担处理异常的任务,以减轻底层函数的负担,而把承担处理异常的任务,以减轻底层函数的负担,而把处理异常的任务上移到某一层去处理。这样可以提高处理异常的任务上移到某一层去处理。这样可以提高效率。效率。C+处理异常的机制是由处理异常的机制是由3个部分组成的,即检查个部分组成的,即检查(try)、抛出抛出(throw)和捕捉和捕捉(catch)。把需要检查的把需要检查的语句放在语句放在try块中,块中,thr
8、ow用来当出现异常时发出一个用来当出现异常时发出一个异常信息,而异常信息,而catch则用来捕捉异常信息,如果捕捉则用来捕捉异常信息,如果捕捉到了异常信息,就处理它。到了异常信息,就处理它。例例14.1 给出三角形的三边给出三角形的三边a,b,c,求三角形的面积。只求三角形的面积。只有有a+bc,b+ca,c+ab时才能构成三角形。设置异常时才能构成三角形。设置异常处理,对不符合三角形条件的输出警告信息,不予计处理,对不符合三角形条件的输出警告信息,不予计算。算。先写出没有异常处理时的程序先写出没有异常处理时的程序:#include#include using namespace std;in
9、t main()double triangle(double,double,double);double a,b,c;cinabc;while(a0&b0&c0)couttriangle(a,b,c)abc;return 0;double triangle(double a,double b,double c)double area;double s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c);return area;运行情况如下运行情况如下:6 5 4(输入输入a,b,c的值的值)9.92157 (输出三角形的面积输出三角形的面积)1 1.5 2 (输入输
10、入a,b,c的值的值)0.726184 (输出三角形的面积输出三角形的面积)1 2 1 (输入输入a,b,c的值的值)0 (输出三角形的面积,此结果显然不对输出三角形的面积,此结果显然不对,因为不是三角形因为不是三角形)1 0 6 (输入输入a,b,c的值的值)(结束结束)修改程序,在函数修改程序,在函数traingle中对三角形条件进行检查,中对三角形条件进行检查,如果不符合三角形条件,就抛出一个异常信息,在主如果不符合三角形条件,就抛出一个异常信息,在主函数中的函数中的try-catch块中调用块中调用traingle函数,检测有无函数,检测有无异常信息,并作相应处理。修改后的程序如下异常
11、信息,并作相应处理。修改后的程序如下:#include#include using namespace std;void main()double triangle(double,double,double);double a,b,c;cinabc;try/在在try块中包含要检查的函数块中包含要检查的函数 while(a0&b0&c0)couttriangle(a,b,c)abc;catch(double)/用用catch捕捉异常信息并作相应处理捕捉异常信息并作相应处理 couta=a,b=b,c=c,that is not a triangle!endl;coutendendl;doubl
12、e triangle(double a,double b,double c)/计算三角形的面积的函数计算三角形的面积的函数double s=(a+b+c)/2;if(a+b=c|b+c=a|c+a=b)throw a;/当不符合三角形条件抛出异常信息当不符合三角形条件抛出异常信息 return sqrt(s*(s-a)*(s-b)*(s-c);程序运行结果如下程序运行结果如下:6 5 4(输入输入a,b,c的值的值)9.92157 (计算出三角形的面积计算出三角形的面积)1 1.5 2 (输入输入a,b,c的值的值)0.726184 (计算出三角形的面积计算出三角形的面积)1 2 1 (输入输
13、入a,b,c的值的值)a=1,b=2,c=1,that is not a triangle!(异常处理异常处理)end现在结合程序分析怎样进行异常处理。现在结合程序分析怎样进行异常处理。(1)首先把可能出现异常的、需要检查的语句或程序首先把可能出现异常的、需要检查的语句或程序段放在段放在try后面的花括号中。后面的花括号中。(2)程序开始运行后,按正常的顺序执行到程序开始运行后,按正常的顺序执行到try块,开块,开始执行始执行try块中花括号内的语句。如果在执行块中花括号内的语句。如果在执行try块内块内的语句过程中没有发生异常,则的语句过程中没有发生异常,则catch子句不起作用,子句不起作
14、用,流程转到流程转到catch子句后面的语句继续执行。子句后面的语句继续执行。(3)如果在执行如果在执行try块内的语句块内的语句(包括其所调用的函数包括其所调用的函数)过程中发生异常,则过程中发生异常,则throw运算符抛出一个异常信息。运算符抛出一个异常信息。throw抛出异常信息后,流程立即离开本函数,转到抛出异常信息后,流程立即离开本函数,转到其上一级的函数其上一级的函数(main 函数函数)。throw抛出什么样的数据由程序设计者自定,可以是抛出什么样的数据由程序设计者自定,可以是任何类型的数据。任何类型的数据。(4)这个异常信息提供给这个异常信息提供给try-catch结构,系统会
15、寻找结构,系统会寻找与之匹配的与之匹配的catch子句。子句。(5)在进行异常处理后,程序并不会自动终止,继续在进行异常处理后,程序并不会自动终止,继续执行执行catch子句后面的语句。子句后面的语句。由于由于catch子句是用来处理异常信息的,往往被称为子句是用来处理异常信息的,往往被称为catch异常处理块或异常处理块或catch异常处理器。异常处理器。下面讲述异常处理的语法。下面讲述异常处理的语法。throw语句一般是由语句一般是由throw运算符和一个数据组成的,运算符和一个数据组成的,其形式为其形式为throw 表达式表达式;try-catch的结构为的结构为try 被检查的语句被检
16、查的语句 catch(异常信息类型异常信息类型 变量名变量名)进行异常处理的语句进行异常处理的语句说明说明:(1)被检测的函数必须放在被检测的函数必须放在try块中,否则不起作用。块中,否则不起作用。(2)try块和块和catch块作为一个整体出现,块作为一个整体出现,catch块是块是try-catch结构中的一部分,必须紧跟在结构中的一部分,必须紧跟在try块之后,块之后,不能单独使用,在二者之间也不能插入其他语句。但不能单独使用,在二者之间也不能插入其他语句。但是在一个是在一个try-catch结构中,可以只有结构中,可以只有try块而无块而无catch块。即在本函数中只检查而不处理,把
17、块。即在本函数中只检查而不处理,把catch处理块处理块放在其他函数中。放在其他函数中。(3)try和和catch块中必须有用花括号括起来的复合语块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句,也不能省略花括号。句,即使花括号内只有一个语句,也不能省略花括号。(4)一个一个try-catch结构中只能有一个结构中只能有一个try块,但却可以块,但却可以有多个有多个catch块,以便与不同的异常信息匹配。块,以便与不同的异常信息匹配。(5)catch后面的圆括号中,一般只写异常信息的类型后面的圆括号中,一般只写异常信息的类型名,名,如如catch(double)catch只检查所捕
18、获异常信息的类型,而不检查它们只检查所捕获异常信息的类型,而不检查它们的值。因此如果需要检测多个不同的异常信息,应当的值。因此如果需要检测多个不同的异常信息,应当由由throw抛出不同类型的异常信息。抛出不同类型的异常信息。异常信息可以是异常信息可以是C+系统预定义的标准类型,也可以系统预定义的标准类型,也可以是用户自定义的类型是用户自定义的类型(如结构体或类如结构体或类)。如果由。如果由throw抛出的信息属于该类型或其子类型,则抛出的信息属于该类型或其子类型,则catch与与throw二者匹配,二者匹配,catch捕获该异常信息。捕获该异常信息。catch还可以有另外一种写法,即除了指定类
19、型名外,还可以有另外一种写法,即除了指定类型名外,还指定变量名,如还指定变量名,如catch(double d)此时如果此时如果throw抛出的异常信息是抛出的异常信息是double型的变量型的变量a,则则catch在捕获异常信息在捕获异常信息a的同时,还使的同时,还使d获得获得a的值,的值,或者说或者说d得到得到a的一个拷贝。什么时候需要这样做呢的一个拷贝。什么时候需要这样做呢?有时希望在捕获异常信息时,还能利用?有时希望在捕获异常信息时,还能利用throw抛出抛出的值,如的值,如catch(double d)coutthrow d;这时会输出这时会输出d的值的值(也就是也就是a值值)。当抛
20、出的是类对象时。当抛出的是类对象时,有时希望在,有时希望在catch块中显示该对象中的某些信息。块中显示该对象中的某些信息。这时就需要在这时就需要在catch的参数中写出变量名的参数中写出变量名(类对象名类对象名)。(6)如果在如果在catch子句中没有指定异常信息的类型,而子句中没有指定异常信息的类型,而用了删节号用了删节号“”,则表示它可以捕捉任何类型的异,则表示它可以捕捉任何类型的异常信息,如常信息,如catch()coutOKendl;它能捕捉所有类型的异常信息,并输出它能捕捉所有类型的异常信息,并输出OK。这种这种catch子句应放在子句应放在trycatch结构中的最后,相当结构中
21、的最后,相当于于“其他其他”。如果把它作为第一个。如果把它作为第一个catch子句,则后子句,则后面的面的catch子句都不起作用。子句都不起作用。(7)trycatch结构可以与结构可以与throw出现在同一个函数中,出现在同一个函数中,也可以不在同一函数中。当也可以不在同一函数中。当throw抛出异常信息后,抛出异常信息后,首先在本函数中寻找与之匹配的首先在本函数中寻找与之匹配的catch,如果在本函如果在本函数中无数中无trycatch结构或找不到与之匹配的结构或找不到与之匹配的catch,就就转到离开出现异常最近的转到离开出现异常最近的trycatch结构去处理。结构去处理。(8)在某
22、些情况下,在在某些情况下,在throw语句中可以不包括表达语句中可以不包括表达式,如式,如throw;表示表示“我不处理这个异常,请上级处理我不处理这个异常,请上级处理”。(9)如果如果throw抛出的异常信息找不到与之匹配的抛出的异常信息找不到与之匹配的catch块,那么系统就会调用一个系统函数块,那么系统就会调用一个系统函数terminate,使程序终止运行。使程序终止运行。例例14.2 在函数嵌套的情况下检测异常处理。在函数嵌套的情况下检测异常处理。这是一个简单的例子,用来说明在这是一个简单的例子,用来说明在try块中有函数嵌块中有函数嵌套调用的情况下抛出异常和捕捉异常的情况。请自己套调
23、用的情况下抛出异常和捕捉异常的情况。请自己先分析以下程序。先分析以下程序。#include using namespace std;int main()void f1();try f1();/调用调用f1()catch(double)coutOK0!endl;coutend0endl;return 0;void f1()void f2();try f2();/调用调用f2()catch(char)coutOK1!;coutend1endl;void f2()void f3();try f3();/调用调用f3()catch(int)coutOk2!endl;coutend2endl;void
24、f3()double a=0;try throw a;/抛出抛出double类型异常信息类型异常信息 catch(float)coutOK3!endl;coutend3endl;分分3种情况分析运行情况种情况分析运行情况:(1)执行上面的程序。图执行上面的程序。图14.1为有函数嵌套时异常为有函数嵌套时异常处理示意图。处理示意图。图图14.1程序运行结果如下程序运行结果如下:OK0!(在主函数中捕获异常在主函数中捕获异常)end0 (执行主函数中最后一个语句时的输出执行主函数中最后一个语句时的输出)(2)如果将如果将f3函数中的函数中的catch子句改为子句改为catch(double),而程
25、序中其他部分不变,则程序运行结果如下而程序中其他部分不变,则程序运行结果如下:OK3!(在在f3函数中捕获异常函数中捕获异常)end3 (执行执行f3函数中最后一个语句时的输出函数中最后一个语句时的输出)end2 (执行执行f2函数中最后一个语句时的输出函数中最后一个语句时的输出)end1 (执行执行f1函数中最后一个语句时的输出函数中最后一个语句时的输出)end0 (执行主函数中最后一个语句时的输出执行主函数中最后一个语句时的输出)(3)如果在此基础上再将如果在此基础上再将f3函数中的函数中的catch块改为块改为catch(double)coutOK3!endl;throw;程序运行结果如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C面向对象程序设计 面向 对象 程序设计 课件
限制150内