C++程序设计 第14章 命名空间与异常处理

上传人:努力****83 文档编号:187469587 上传时间:2023-02-14 格式:PPT 页数:43 大小:286KB
收藏 版权申诉 举报 下载
C++程序设计 第14章 命名空间与异常处理_第1页
第1页 / 共43页
C++程序设计 第14章 命名空间与异常处理_第2页
第2页 / 共43页
C++程序设计 第14章 命名空间与异常处理_第3页
第3页 / 共43页
资源描述:

《C++程序设计 第14章 命名空间与异常处理》由会员分享,可在线阅读,更多相关《C++程序设计 第14章 命名空间与异常处理(43页珍藏版)》请在装配图网上搜索。

1、第第 十四十四 章章 命名空间与异常处理命名空间与异常处理命名空间n命名空间的意义n什么是命名空间n限定名字(别名使用)nUsing声明与定向n无名的命名空间命名空间的意义n命名空间(名字空间)主要是解决名字(用户定义的类型名、变量名和函数名)冲突的问题。nNamespace 命名空间的名字 /各种名字的声明或定义 实例分析#includeiostream.hnamespace Myint numb;int add(int n)coutnendl;return(n+);namespace You int numb;int add(int n)coutnendl;return(n+);void

2、main()My:numb=My:add(100);You:numb=You:add(10);别名的使用n比较短的名字可能会导致冲突,而使用长的命名空间的名字,又不方便。n对长的命名空间的名字,可以使用别名。也可以对标准库的长命名空间的名字取别名。n定义格式:namespace N1=name1;N1是name1的别名。using的声明与定向nusing声明格式:using NAME:成员 用此方法表示使用的是NAME中的成员nUsing 定向格式:using namespace NAME 用此方法表示可以使用NAME中的成员无名的命名空间n可以定义一个没有名字的命名空间。nnamespace

3、 int num;int fun();相当于:namespace ss int num;int fun();using namespace ss;使用名空间标识符的3种方法n使用有效名称包括名空间、范围操作符:和所需要的标识符alpha =std:abs(beta);n写一个使用声明 using std:abs;alpha =abs(beta);n写一个使用说明,全局的或局部的using namespace std;alpha =abs(beta);异常处理n异常的概念n编译错误(语法错误)n运行错误n逻辑错误n运行异常#include void f(char*str)ifstream sou

4、rce(str);if(source.fail()cerr“error opening the file:”strendl;exit(1);n异常是对所能预料的运行错误进行处理的一套实现机制。异常的概念异常的发生、传递和处理异常处理的基本思想n发现一个问题函数不处理它,引发一个异常,希望它的(直接或间接)调用者能够处理这个问题;n主函数设置处理异常即可;n主函数捕获这个异常来进行处理;n如果程序始终没有处理这个异常,最终它会被传到c+运行系统那里,运行系统捕获异常后通常只是简单的终止这个程序.ntry,throw和catch语句是c+语言中用于实现异常处理的机制.n定义异常(try语句块)n定

5、义异常处理(catch语句块)n抛掷异常(throw语句块)异常处理的实现nthrowthrow表达式语法表达式语法:throw throw 表达式表达式ntrytry块语法块语法:try try 被检测的语句被检测的语句 /复合语句复合语句ncatch(catch(异常类型说明异常类型说明)进行异常处理的语句进行异常处理的语句 /复合语句复合语句异常处理的语法:使用说明 In被检测的函数必须放在try块内,否则不起作用;ntry块和catch块作为一个整体出现,之间不能插入其它语句;n可以只有try块而无catch块ntry块和catch块中符合语句必须用 括起,即使一条语句;n经常有一个t

6、ry块,而有多个catch块;使用说明 IInCatch后面的括号内经常写类型名;catch(double);/合法 catch(double d);/合法 catch();/合法,俘获任何类型的异常n先在本层找一只匹配的catch,找不到,转到上层去处理;throw;/把俘获的异常抛出,由上层处理 异常处理的实现n若某段程序发现了自己不能处理的异常,就可用throw 表达式将这个异常“抛”给调用者.ntry后的复合语句是代码的保护段.若预料某段程序代码有可能发生异常,就将它放在try子句之后ncatch子句后的复合语句是异常处理程序,捕获由throw表达式抛掷的异常.异常处理的执行过程n控制

7、通过正常的顺序执行到达try语句.n若保护段执行期间没有引起异常,则try后的catch子句就不执行.n若保护段执行期间有异常被抛掷,则从通过throw操作数创建的对象中创建一个异常对象,编译器在能够处理抛掷类型的异常的更高执行程序上下文中寻找一个catch子句.n若匹配的处理器未找到,则函数terminate将被自动调用(其缺省功能为调用abort终止程序).n若找到了一个匹配的catch处理程序,形参初始化后,catch处理程序被执行.例14-1void main(int argc,char*argv)char*name=d:a1.dat;ifstream source(name,ios:

8、nocreate);/打开文件 try if(source.fail()throw name;catch(char*s)cout error opening the file s endl;exit(1);cout opening the file successfullyendl;source.close();需注意的问题n在try后需紧跟一个或多个catch语句ncatch的形参只有一个(类型参数)n类型匹配时进行异常处理n可以将抛掷异常和处理异常放在不同函数中#include double Div(double,double);void main()try cout 7.3/2.0=Di

9、v(7.3,2.0)endl;cout 7.3/0.0=Div(7.3,0.0)endl;cout 7.3/1.0=Div(7.3,1.0)endl;catch(double)cout except of deviding zero.n;cout That is ok.n;double Div(double a,double b)if(b=0.0)throw b;return a/b;异常的规则n任意数量的catch分程序立即出现在try分程序后;在try分程序出现之前,不能出现catch分程序。ncatch行的圆括号可包含数据类型的声明,类似形参,使得被捕获的对象在处理异常的分程序中使用n异

10、常的匹配需严格类型匹配,如抛掷的异常没有匹配的catch则调用abort()。ncatch分程序执行后,其后面语句继续执行。例例14-2 函数嵌套情况的异常检测处理函数嵌套情况的异常检测处理#include“iostream”using namespace std;int main()void f1();tryf1();catch (double)cout“OK0!”endl;cout“end0”endl;return 0;void f1()void f2();try f2();catch(char)cout“OK1!”;coutendlendl;void f2()void f3();try

11、f3();catch(int)cout“OK2!”;cout“end2”endl;void f3()double a=0;try throw a;catch(float)cout“OK3!”;cout“end3”endl;在函数声明中进行异常情况指定1、double triangle(double,double,double)throw(double);/函数triangle只能抛出double类型的异常信息2、double triangle(double,double,double)throw(int,double,float,char);/函数triangle能抛出int,double,f

12、loat,char类型的异常信息3、double triangle(double,double,double)throw();/函数triangle能抛出任何类型的异常信息/异常处理中的构造与析构#include void MyFunc(void);class Expt public:Expt();Expt();const char*ShowReason()const returnExpt类异常。;class Demo public:Demo();Demo();Demo:Demo()cout构造Demo.endl;Demo:Demo()cout析构Demo.endl;void MyFunc()

13、Demo D;cout在MyFunc()中抛掷Expt类异常。endl;throw Expt();int main()cout在main函数中。endl;try cout在try块中,调用MyFunc()。endl;MyFunc();catch(Expt E)cout在catch异常处理程序中endl;cout捕获到Expt类型异常:;coutE.ShowReason()endl;catch(char*str)cout捕获到其它异常:strendl;cout回到main函数。从这里恢复执行endl;return 0;多路捕获n多路捕获:多个不同类型异常抛出的捕获。#include#includ

14、e class Stringpublic:String(char*,int);class Range /异常类1 public:Range(int j):index(j)int index;class Size;/异常类2 char&operator(int k)if(0=k&klen)return pk;throw Range(k);private:char*p;int len;static int max;void g(String&str)int num=10;for(int n=0;nnum;n+)cout strn;cout endl;int String:max=20;String

15、:String(char*str,int si)if(si0|maxsi)throw Size();p=new charsi;strncpy(p,str,si);len=si;void f()/代码区1 try /代码区2 String s(abcdefghijklmnop,26);g(s);catch(String:Ranger)cerr out of range:r.index endl;/代码区3 catch(String:Size)cerr size illegal!n;cout The program will be continued here.nn;/代码区4 void main

16、()/代码区5 f();cout These code is not effected by probably exception in f().n;n嵌套类:在一个类定义的内部定义一个类,称为嵌套类。n嵌套类的成员函数和静态成员可以在包含该类的外部定义,但嵌套类的作用域在包含该类定义的内部。多层次异常处理机制try/throw E();catch(H)/catch(E)/void f()try g();catch(Range)/.catch(Size)/.catch(.)/.void g()h();void h()try h1();catch(Size)/.throw 10;catch(Ma

17、tharr)/.catch(size)/.throw;void h1()/.throw(Size);try /.throw Range;h2();h3();void h2()/.throw Matharr;void h3()/.throw Size;try的分程序和throw语句捕获异常的类型在函数调用链中的异常处理在函数调用链中的异常处理异常对象不被捕获,将沿调用链向上组织异常的方法n异常枚举族系:文件,数学等enum FileErrors(nonExist,wrongFormat,diskSeekError,.;int f()try/.throw wrongFormat;catch(FileErrors fe)switch(fe)case nonExist:/.case wrongFormat:/.case diskSeekError:/.异常派生层次结构class FileError;class NonExist:public FileErrors;class WrongFormat:public FileErrors;class DiskSeekError:public FileErrors;int f()try/.throw WrongFormat;catch(NonExist)/.catch(DiskSeekError)/.catch(FileErrors)/./.

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!