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

下载本文档

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

文档简介

第10章异常处理和命名空间

10.1异常处理

10.2命名空间和头文件命名规则

本章主要内容1

10.1异常处理

10.1.1异常处理概述

10.1.2异常处理的方法

本节主要内容210.1异常处理10.1.1异常处理概述

编译时的错误程序中常见的错误运行时的错误。

编译时的错误:

主要是语法错误,如关键字拼写错误、语句末尾缺分号、括号不匹配等。这类错误相对比较容易修正。

运行时的错误:

﹡有些是不可预料的,如算法出错;

﹡有些可以预料但却无法避免,如内存空间不够,无法实现指定的操作等;无法打开文件、数组下标越界等。

这类错误比较隐蔽,不易被发现。

程序在运行过程中出现的错误统称为异常,对异常的处理称为异常处理。3例10.1传统的异常处理方法举例。#include<iostream>usingnamespacestd;intDiv(intx,inty);//函数Div的原型intmain(){cout<<"7/3=

"<<Div(7,3)<<endl;cout<<"5/0=

"<<Div(5,0)<<endl;return0;}intDiv(intx,inty)//定义函数Div{if(y==0){cout<<"除数为0,错误!"<<endl;exit(0);}returnx/y;}

程序运行结果如下:7/3=2

除数为0,错误!

传统的异常处理方法可以满足小型的应用程序需要,但无法保证程序的可靠运行,而且采用判断或分支语句处理异常的方法不适合大量异常的处理,更不能处理不可预知的异常。

传统的异常处理方法基本上是采取判断或分支语句来实现。

410.1.2异常处理的方法

C++处理异常的办法是:

如果在执行一个函数过程中出现异常,不在本函数中立即处理,而是发出一个信息,传给它的上一级(即调用函数)来解决,如果上一级函数也不能处理,就再传给其上一级,由其上一级处理。如此逐级上传,如果到最高一级还无法处理,则终止程序的运行。

C++处理异常的机制是由检查、抛出和捕获三个部分组成,分别由三种语句来完成:

try(检查)

throw(抛出)catch(捕获)51.异常的抛出抛出异常使用throw语句,其格式如下:

“表达式”是表示抛出的异常类型,异常类型由表达式的类型来表示。例如,含有throw语句的函数Div可写成:

intDiv(intx,inty){if(y==0)

throwy;

returnx/y;//当除数y不为0时,返回x/y的值

}

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

例如,用于处理除数为零异常的try_catch语句如下:

try//检查异常

{cout<<"7/3"<<Div(7,3)<<endl;//被检查的复合语句

cout<<"5/0"<<Div(5,0)<<endl;

}catch(int)//捕获异常,异常类型是int型

{cout<<"除数为0,错误!"<<endl;//进行异常处理的复合语句

}

8例10.2处理除数为零异常的程序。#include<iostream>usingnamespacestd;intDiv(intx,inty);//函数Div的原型intmain(){try

//检查异常

{cout<<"7/3="<<Div(7,3)<<endl;//被检查的复合语句

cout<<"5/0="<<Div(5,0)<<endl;}

catch(int)

//捕获异常,异常类型是int型

{cout<<"除数为0,错误!"<<endl;}//进行异常处理的复合语句

cout<<"end"<<endl;return0;}intDiv(intx,inty){if(y==0)

throwy;

//抛出异常,当除数y为0时,//语句throw将抛出int型异常

returnx/y;}//当除数y不为0时,返回x/y的值程序运行结果如下:7/3=2除数为0,错误!end9说明:

(1)被检测的语句或程序段必须放在try块中,否则不起作用。

(2)try和catch块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句也不能省略花括号。

(3)一个try_catch结构中只能有一个try块,但却可以有多个catch块,以便与不同的异常信息匹配。

catch后面的括号中,一般只写异常信息的类型名。10例10.3有多个catch块的异常处理程序。#include<iostream>usingnamespacestd;intmain(){doublea=2.5;

try//检查异常

{throwa;}//抛出异常

catch(int)//捕获异常,异常类型是int型

{cout<<"异常发生!整数型!"<<endl;}//进行异常处理的复合语句

catch(double)//捕获异常,异常类型是double型

{cout<<"异常发生!双精度型!"<<endl;}//进行异常处理的复合语句

cout<<"end"<<endl;return0;}

程序运行结果如下:异常发生!双精度型!end11

(4)如果在catch子句中没有指定异常信息的类型,而用了删节号“…”,则表示它可以捕获任何类型的异常信息。例10.4有删节号“…”的异常处理程序。#include<iostream>usingnamespacestd;voidfunc(intx){if(x)

throwx;}//抛出异常,throw抛出整型异常intmain(){try//检查异常

{func(5);cout<<"Nohere!"<<endl;}//被检查的复合语句

catch(…)

//捕获异常,异常类型是任意类型

{cout<<"任意类型异常!"<<endl;}//进行异常处理的复合语句

cout<<"end"<<endl;return0;}程序运行结果如下:任意类型异常!end12

(5)在某种情况下,在throw语句中可以不包括表达式,如:

throw;

此时它将把当前正在处理的异常信息再次抛出,给其上一层的catch块处理。

(6)C++中,一旦抛出一个异常,而程序又不捕获的话,那么系统就会调用一个系统函数terminate,由它调用abort终止程序。13

例10.5输入三角形的三条边长,求三角形的面积。当输入边的长度小于或等于0,或者当三条边都大于0,但不能构成三角形时,分别抛出异常,结束程序运行。#include<iostream>#include<cmath>usingnamespacestd;doubletriangle(doublea,doubleb,doublec){doubles=(a+b+c)/2;//三角形面积计算函数

if(a+b<=c||b+c<=a||c+a<=b)throw1.0;//语句throw抛出double型异常

returnsqrt(s*(s-a)*(s-b)*(s-c));}14intmain(){doublea,b,c;try//检查异常{cout<<"请输入三角形的三个边长(a、b、c):"<<endl;cin>>a>>b>>c;

if(a<=0||b<=0||c<=0)throw1;//语句throw抛出int型异常

while(a>0&&b>0&&c>0){cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;cout<<"三角形的面积="<<triangle(a,b,c)<<endl;cout<<"请输入三角形的三个边长(a、b、c):"<<endl;cin>>a>>b>>c;

if(a<=0||b<=0||c<=0)throw1;//语句throw抛出int型异常

}}catch(double)//捕获异常,异常类型是double型{cout<<"这三条边不能构成三角形,异常发生,结束!"<<endl;}catch(int)//捕获异常,异常类型是int型{cout<<"边长小于或等于0,异常发生,结束!"<<endl;}return0;}15intmain(){doublea,b,c;try//检查异常{cout<<"请输入三角形的三个边长(a、b、c):"<<endl;cin>>a>>b>>c;if(a<=0||b<=0||c<=0)throw1;//语句throw抛出int型异常

while(a>0&&b>0&&c>0){cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;cout<<"三角形的面积="<<triangle(a,b,c)<<endl;cout<<"请输入三角形的三个边长(a、b、c):"<<endl;cin>>a>>b>>c;

if(a<=0||b<=0||c<=0)throw1;}}//语句throw抛出int型异常catch(double)//捕获异常,异常类型是double型{cout<<"这三条边不能构成三角形,异常发生,结束!"<<endl;}catch(int)//捕获异常,异常类型是int型{cout<<"边长小于或等于0,异常发生,结束!"<<endl;}return0;}程序运行结果如下:请输入三角形的三个边长(a、b、c):345↙a=3,b=4,c=5三角形的面积=6请输入三角形的三个边长(a、b、c):224↙a=2,b=2,c=4这三条边不能构成三角形,异常发生,结束!16

10.2命名空间和头文件命名规则

10.2.1命名空间

10.2.2头文件命名规则

本节主要内容1710.2.1命名空间

*为什么要引入命名空间一个大型软件通常是由多人合作完成的,不同的人分别完成不同的模块。不同的人分别定义了函数和类,放在不同的头文件中。有可能在不同的头文件中用了相同名字来定义的函数或类。这样在程序中就会出现命名冲突,就会引起程序出错。另外,如果在程序中用到第三方的库,也容易产生同样的问题。为了解决这一问题,ANSIC++引入了命名空间,用来处理程序中常见的同名冲突问题。18

*什么是命名空间所谓命名空间,实际上就是一个由程序设计者命名的内存区域。程序设计者可以根据需要指定一些有名字的命名空间,将各命名空间中声明的标识符与该命名空间标识符建立关联,保正不同命名空间的同名标识符不发生冲突。19

*声明命名空间的方法

在命名空间NS中定义了两个简单变量i和j:

namespaceNS{inti=5;intj=10;}

C++中命名空间的作用类似于操作系统中的目录和文件的关系,不同子目录中的文件可以同名。调用文件时应指出文件路径。namespace是定义命名空间的所必须写的关键字NS是用户自己指定的命名空间的名字

花括号内是命名空间的作用域20

*标准命名空间std

除了用户可以声明自己的命名空间外,C++还定义了一个标准命名空间std。

usingnamespacestd;其含义就是使用标准命名空间std。

*标准命名空间std的使用方法

(1)在源文件中使用“usingnamespacestd;”语句。例如:

#include<iostream>

usingnamespacestd;intmain(){cout<<”WelcometoC++!”<<endl;return0;}21(2)在该标识符前面加上命名空间及作用域运算符“::”。例如:

#include<iostream>intmain(){std::cout<<”WelcometoC++!”<<std::endl;return0;}说明:由于C++的早期版本中没有命名空间的概念,库中的有关内容也没有放在std命名空间中,因而在程序中不必对std进行声明。但是,用标准的C++编程是应该对命名空间std的成员进行声明或限定的。22例10.6命名空间的使用举例。#include<iostream>namespaceUniversity//声明命名空间,名为University{intgrade=3;}namespaceHighschool//声明命名空间,名为Highschool{intgrade=4;}intmain(){std::cout<<"Theunversity'sgradeis:"<<University::grade<<std

温馨提示

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

评论

0/150

提交评论