C++的异常处理和空间命名_第1页
C++的异常处理和空间命名_第2页
C++的异常处理和空间命名_第3页
C++的异常处理和空间命名_第4页
C++的异常处理和空间命名_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、 第10章 异常处理和命名空间 10.1 异常处理 10.2 命名空间和头文件命名规则 本章主要内容1 10.1 异常处理 10.1.1 异常处理概述 10.1.2 异常处理的方法 本节主要内容本节主要内容210.1 10.1 异常处理异常处理10.1.1异常处理概述 编译时的错误 程序中常见的错误 运行时的错误。 编译时的错误: 主要是语法错误主要是语法错误, ,如关键字拼写错误、语句末尾缺分号、括如关键字拼写错误、语句末尾缺分号、括号不匹配等。这类错误相对比较容易修正。号不匹配等。这类错误相对比较容易修正。 运行时的错误: 有些是有些是不可预料不可预料的的, ,如算法出错如算法出错; ;

2、有些可以预料但却有些可以预料但却无法避免无法避免, ,如内存空间不够如内存空间不够, ,无法实现指无法实现指定的操作等定的操作等; ;无法打开文件、数组下标越界等。无法打开文件、数组下标越界等。 这类错误比较隐蔽这类错误比较隐蔽, ,不易被发现不易被发现 。 程序在运行过程中出现的错误统称为异常,对异常的处理称为异常处理。3例例10.1 10.1 传统的异常处理方法举例。传统的异常处理方法举例。#include#includeusing namespace std; using namespace std; int Div(int x,int y); /int Div(int x,int y)

3、; /函数函数DivDiv的原型的原型int main()int main() cout7/3= cout7/3= Div(7,3)endl;Div(7,3)endl; cout5/0= cout5/0= Div(5,0)endl;Div(5,0)endl; return 0; return 0; int Div(int x,int y) /int Div(int x,int y) /定义函数定义函数DivDiv if (y=0)if (y=0) cout cout除数为除数为0,0,错误错误!endl;!endl; exit (0); exit (0); return x/y; return

4、 x/y; 程序运行结果如下程序运行结果如下: : 7/3=2 7/3=2 除数为除数为0,0,错误错误! ! 传统的异常处理方法传统的异常处理方法可以满足小型的应用程可以满足小型的应用程序需要序需要, , 但无法保证程序的可靠运行但无法保证程序的可靠运行, ,而且而且采采用用判断或分支语句判断或分支语句处理异常的方法处理异常的方法不适合大量不适合大量异常的处理异常的处理, ,更不能处理不可预知的异常。更不能处理不可预知的异常。 传统的异常处理方法传统的异常处理方法基本上是采取判断或分支基本上是采取判断或分支语句来实现语句来实现。 410.1.2 10.1.2 异常处理的方法异常处理的方法 C

5、+处理异常的办法是: 如果在执行一个函数过程中出现异常,不在本函数中立即处理,而是发出一个信息,传给它的上一级(即调用函数)来解决,如果上一级函数也不能处理,就再传给其上一级,由其上一级处理。 如此逐级上传,如果到最高一级还无法处理, 则终止程序的运行。 C+处理异常的机制是由检查、抛出和捕获三个部分组成,分别由三种语句来完成: try (检查) throw (抛出) catch (捕获)51.异常的抛出 抛出异常使用throw语句,其格式如下: “表达式”是表示抛出的异常类型,异常类型由表达式的类型来表示。 例如,含有throw语句的函数Div可写成: int Div(int x,int y

6、) if (y=0) throw y; return x/y; /当除数y不为0时,返回x/y的值 由于变量y的类型是int,所以当除数y为0时,语句throw将抛出int型异常。该异常将由与之匹配的catch语句来捕获。throw 表达式;62.异常的检查和捕获 异常的检查和捕获使用try语句和catch语句,格式如式: try try 被检查的复合语句被检查的复合语句 catch ( catch (异常类型声明异常类型声明1)1) 进行异常处理的复合语句进行异常处理的复合语句1 1 catch ( catch (异常类型声明异常类型声明2)2) 进行异常处理的复合语句进行异常处理的复合语句

7、2 2 . . . . . . catch ( catch (异常类型声明异常类型声明n)n) 进行异常处理的复合语句进行异常处理的复合语句n n 7 例如,用于处理除数为零异常的try_catch语句如下: try /try /检查异常检查异常 cout7/3Div(7,3)endl; / cout7/3Div(7,3)endl; /被检查的复合语句被检查的复合语句 cout5/0Div(5,0)endl;cout5/0Div(5,0)endl; catch (int) / catch (int) /捕获异常捕获异常, ,异常类型是异常类型是intint型型 cout cout除数为除数为0

8、,0,错误错误!endl; /!endl; /进行进行异常处理异常处理的复合语句的复合语句 8例例10.2 10.2 处理除数为零异常的程序。处理除数为零异常的程序。#include#include using namespace std; using namespace std; intint Div( Div(intint x,intx,int y); / y); /函数函数DivDiv的原型的原型intint main() main() try try /检查异常检查异常 coutcout7/3=Div(7,3)7/3=Div(7,3)endlendl; /; /被检查的复合语句被检查的

9、复合语句 coutcout5/0=Div(5,0)5/0=Div(5,0)endlendl; ; catch (catch (intint) ) /捕获异常捕获异常, ,异常类型是异常类型是intint型型 coutcout除数为除数为0,0,错误错误!endlendl;/;/进行异常处理的复合语句进行异常处理的复合语句 coutcoutendendendlendl; ; return 0; return 0; intint Div( Div(intint x,intx,int y) y) if (y=0) if (y=0) throw y;throw y; /抛出异常抛出异常, ,当除数当除

10、数y y为为0 0时时, , / /语句语句throwthrow将抛出将抛出intint型异常型异常 return x/y; /return x/y; /当除数当除数y y不为不为0 0时时, ,返回返回x/yx/y的值的值程序运行结果如下程序运行结果如下: :7/3=27/3=2除数为除数为0,0,错误错误! ! endend9说明: (1) 被检测的语句或程序段必须放在try块中,否则不起作用。 (2) try和catch块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句也不能省略花括号。 (3) 一个try_catch结构中只能有一个try块,但却可以有多个catch块,以便与

11、不同的异常信息匹配。 catch后面的括号中,一般只写异常信息的类型名。10例10.3 有多个catch块的异常处理程序。#include#include using namespace using namespace stdstd; ; intint main() main() double a=2.5; double a=2.5; try /try /检查异常检查异常 throw a;throw a; /抛出异常抛出异常 catch(catch(intint ) / ) /捕获异常捕获异常, ,异常类型是异常类型是intint型型 coutcout异常发生!整数型!异常发生!整数型!end

12、lendl; ; / /进行异常处理的复合语句进行异常处理的复合语句 catch (double ) /catch (double ) /捕获异常捕获异常, ,异常类型是异常类型是doubledouble型型 coutcout异常发生!双精度型!异常发生!双精度型!endlendl; ; / /进行异常处理的复合语句进行异常处理的复合语句 coutcoutendendendlendl; ; return 0; return 0; 程序运行结果如下程序运行结果如下: :异常发生!双精度型!异常发生!双精度型!endend11 (4) 如果在catch子句中没有指定异常信息的类型,而用了删节号“”

13、,则表示它可以捕获任何类型的异常信息。例例10.4 10.4 有删节号有删节号“”的异常处理程序。的异常处理程序。#include#includeusing namespace std; using namespace std; void func(int x)void func(int x) if (x) if (x) throw x;throw x; /抛出异常抛出异常,throw,throw抛出整型异常抛出整型异常int main()int main() try /try /检查异常检查异常 func(5); func(5); coutNo here!endl; / coutNo her

14、e!endl; /被检查的复合语句被检查的复合语句 catch (catch () ) /捕获异常捕获异常, ,异常类型是任意类型异常类型是任意类型 coutcout任意类型异常任意类型异常!endl;/!endl;/进行异常处理的复合语句进行异常处理的复合语句 coutendendl;coutendendl; return 0; return 0; 程序运行结果如下程序运行结果如下: :任意类型异常任意类型异常! !endend12 (5) 在某种情况下,在throw语句中可以不包括表达式,如: throw; 此时它将把当前正在处理的异常信息再次抛出,给其上一层的catch块处理。 (6)

15、C+中,一旦抛出一个异常,而程序又不捕获的话,那么系统就会调用一个系统函数terminate,由它调用abort终止程序。13 例10.5 输入三角形的三条边长,求三角形的面积。当输入边的长度小于或等于0,或者当三条边都大于0,但不能构成三角形时,分别抛出异常,结束程序运行。#include #include #include #include using namespace std;using namespace std;double triangle(double a,double b,double c) double triangle(double a,double b,double c

16、) double s=(a+b+c)/2; / double s=(a+b+c)/2; /三角形面积计算函数三角形面积计算函数 if(a+b=c|b+c=a|c+a=b) if(a+b=c|b+c=a|c+a=b) throw 1.0; / throw 1.0; /语句语句throwthrow抛出抛出doubledouble型异常型异常 return sqrt(sreturn sqrt(s* *(s-a)(s-a)* *(s-b)(s-b)* *(s-c); (s-c); 14int main()int main() double a,b,c; double a,b,c;try /try /检

17、查异常检查异常 cout cout请输入三角形的三个边长请输入三角形的三个边长(a(a、b b、c):endl;c):abc; cinabc; if (a=0|b=0|c=0) throw 1; /if (a=0|b=0|c0&b0&c0)while (a0&b0&c0) couta=a,b=b,c=cendl; couta=a,b=b,c=cendl; cout cout三角形的面积三角形的面积=triangle(a,btriangle(a,b, ,c)c)endl;endl; cout cout请输入三角形的三个边长请输入三角形的三个边长(a(a、b b、c

18、):endl;c):abc; cinabc; if(a=0|b=0|c=0) throw 1; /if(a=0|b=0|c=0) throw 1; /语句语句throwthrow抛出抛出intint型异常型异常 catch(double) /catch(double) /捕获异常捕获异常, ,异常类型是异常类型是doubledouble型型 cout cout这三条边不能构成三角形这三条边不能构成三角形, ,异常发生异常发生, ,结束结束!endl; !endl; catch(int) /catch(int) /捕获异常捕获异常, ,异常类型是异常类型是intint型型 cout cout边长

19、小于或等于边长小于或等于0 0,异常发生,异常发生, ,结束结束!endl; !endl; return 0; return 0; 15int main()int main() double a,b,c; double a,b,c;try /try /检查异常检查异常 cout cout请输入三角形的三个边长请输入三角形的三个边长(a(a、b b、c):endl; c):abc;cinabc;if (a=0|b=0|c=0) throw 1; /if (a=0|b=0|c0&b0&c0)while (a0&b0&c0) couta=a,b=b,c=cendl;

20、couta=a,b=b,c=cendl; cout cout三角形的面积三角形的面积=triangle(a,b,c)endl;=triangle(a,b,c)endl; cout cout请输入三角形的三个边长请输入三角形的三个边长(a(a、b b、c):endl;c):abc; cinabc; if(a=0|b=0|c=0) throw 1;if(a=0|b=0|c=0) throw 1; / /语句语句throwthrow抛出抛出intint型异常型异常catch(double) /catch(double) /捕获异常捕获异常, ,异常类型是异常类型是doubledouble型型 cou

21、t cout这三条边不能构成三角形这三条边不能构成三角形, ,异常发生异常发生, ,结束结束!endl; !endl; catch(int) /catch(int) /捕获异常捕获异常, ,异常类型是异常类型是intint型型 cout cout边长小于或等于边长小于或等于0 0,异常发生,异常发生, ,结束结束!endl; !endl; return 0;return 0;程序运行结果如下程序运行结果如下: :请输入三角形的三个边长请输入三角形的三个边长(a(a、b b、c):c):3 4 53 4 5a=3,b=4,c=5a=3,b=4,c=5三角形的面积三角形的面积=6=6请输入三角形的

22、三个边长请输入三角形的三个边长(a(a、b b、c):c):2 2 42 2 4a=2,b=2,c=4a=2,b=2,c=4这三条边不能构成三角形这三条边不能构成三角形, ,异常发生异常发生, ,结束结束! !16 10.2 10.2 命名空间和头文件命名规则命名空间和头文件命名规则 10.2.1 命名空间 10.2.2 头文件命名规则 本节主要内容本节主要内容1710.2.1 10.2.1 命名空间命名空间 * * 为什么要引入命名空间为什么要引入命名空间 一个大型软件通常是由多人合作完成的,不同的人分别完成不同的模块。 不同的人分别定义了函数和类,放在不同的头文件中。有可能在不同的头文件中

23、用了相同名字来定义的函数或类。这样在程序中就会出现命名冲突,就会引起程序出错。 另外,如果在程序中用到第三方的库,也容易产生同样的问题。 为了解决这一问题,ANSI C+引入了命名空间,用来处理程序中常见的同名冲突问题。18 * *什么是命名空间什么是命名空间 所谓命名空间,实际上就是一个由程序设计者命名的内存区域。 程序设计者可以根据需要指定一些有名字的命名空间,将各命名空间中声明的标识符与该命名空间标识符建立关联,保正不同命名空间的同名标识符不发生冲突。19 * * 声明命名空间的方法声明命名空间的方法 在命名空间NS中定义了两个简单变量i和j: namespace NSnamespace

24、 NS int i=5; int i=5; int j=10; int j=10; C+中命名空间的作用类似于操作系统中的目录和文件的关系,不同子目录中的文件可以同名。调用文件时应指出文件路径。 namespace namespace是定义命名空间是定义命名空间的所必须写的关键字的所必须写的关键字 NS NS是是用户自己指定的用户自己指定的命名空间的名字命名空间的名字 花括号内是命名花括号内是命名空间的作用域空间的作用域20 * * 标准命名空间标准命名空间stdstd 除了用户可以声明自己的命名空间外,C+还定义了一个标准命名空间std。 using namespace std;其含义就是使

25、用标准命名空间std。 * *标准命名空间标准命名空间stdstd的使用方法的使用方法 (1)在源文件中使用“using namespace std;”语句。 例如:例如: #include#include using namespace std;using namespace std; int main() int main() cout cout”Welcome to C+!Welcome to C+!”endl;endl; return 0; return 0; 21(2) 在该标识符前面加上命名空间及作用域运算符“:”。 例如:例如: #include#include int main

26、() int main() std:coutstd:cout”Welcome to C+!Welcome to C+!”std:endl;std:endl; return 0; return 0; 说明:说明: 由于C+的早期版本中没有命名空间的概念,库中的有关内容也没有放在std命名空间中,因而在程序中不必对std进行声明。 但是,用标准的C+编程是应该对命名空间std的成员进行声明或限定的。22例例10.6 10.6 命名空间的使用举例。命名空间的使用举例。#include#include namespace University /namespace University /声明命名空间声明命名空间, ,名为名为UniversityUniversity intint grade=3; grade=3; namespace namespace HighschoolHighschool / /声明命名空间声明命名空间, ,名为名为HighschoolHighschool intint grade=4; grade=4;intint main() main() std: std:coutcoutThe The unversitysunversitys grade is: grade is: University:gradeUniv

温馨提示

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

评论

0/150

提交评论