C++语言程序设计教程 第2版 普通高等教育“十一五”国家级规划教材 教学课件 ppt 作者 吕凤翥 王树彬_ 第13章 异常处理和命名空间

上传人:E**** 文档编号:89343012 上传时间:2019-05-23 格式:PPT 页数:32 大小:562.50KB
返回 下载 相关 举报
C++语言程序设计教程 第2版  普通高等教育“十一五”国家级规划教材  教学课件 ppt 作者  吕凤翥 王树彬_ 第13章 异常处理和命名空间_第1页
第1页 / 共32页
C++语言程序设计教程 第2版  普通高等教育“十一五”国家级规划教材  教学课件 ppt 作者  吕凤翥 王树彬_ 第13章 异常处理和命名空间_第2页
第2页 / 共32页
C++语言程序设计教程 第2版  普通高等教育“十一五”国家级规划教材  教学课件 ppt 作者  吕凤翥 王树彬_ 第13章 异常处理和命名空间_第3页
第3页 / 共32页
C++语言程序设计教程 第2版  普通高等教育“十一五”国家级规划教材  教学课件 ppt 作者  吕凤翥 王树彬_ 第13章 异常处理和命名空间_第4页
第4页 / 共32页
C++语言程序设计教程 第2版  普通高等教育“十一五”国家级规划教材  教学课件 ppt 作者  吕凤翥 王树彬_ 第13章 异常处理和命名空间_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《C++语言程序设计教程 第2版 普通高等教育“十一五”国家级规划教材 教学课件 ppt 作者 吕凤翥 王树彬_ 第13章 异常处理和命名空间》由会员分享,可在线阅读,更多相关《C++语言程序设计教程 第2版 普通高等教育“十一五”国家级规划教材 教学课件 ppt 作者 吕凤翥 王树彬_ 第13章 异常处理和命名空间(32页珍藏版)》请在金锄头文库上搜索。

1、第13章 异常处理和命名空间,13.1 异常处理,异常是指程序在运行过程中遇到的不正常情况。 异常处理是指程序中独立开发的各部分能够就程序异常进行相互通信,并处理这些问题。 通过异常处理,可以将检测问题和解决问题分离,程序的某部分能够检测本部分无法解决的问题并将问题传递给准备处理问题的其他部分。,13.1 异常处理,C+采取这样的方法进行异常处理:正在执行的函数出现了异常,如果此函数不能处理,就抛出异常并传给它的调用函数,调用函数捕捉到异常后进行处理;如果调用函数也不能处理,则再逐级向上传递,直至异常被处理完毕为止,或者在都无法处理的情况下终止程序的执行。,13.1 异常处理,13.1.1 C

2、+的异常处理机制,1语法格式,C+的异常处理机制包括try(检查)、throw(抛出)和catch(捕捉)等3个部分。 throw语句的一般语法格式为: throw ; throw是关键字,其后紧接一个表达式。这个表达式表示异常类型(也称异常信息)。,1语法格式,throw语句可以没有表达式,语法格式为: throw; 如果一个函数中出现这条语句,表示此函数不处理异常,而是把异常再次抛出(即重抛出异常),传递给其上一级类或者函数。 这个语句只能出现在catch语句之中。但如果开始不抛出异常,重抛出异常要调用系统定义的函数terminate()。,1语法格式,try-catch语句是一个整体,c

3、atch语句块必须紧跟在try语句块之后,不能单独使用,二者之间不能插入其他语句。在try语句块出现之前,不能出现catch语句块。 try-catch语句的一般语法格式为: try 被检查的语句 catch (异常类型参数 ) 异常处理语句,1语法格式,catch后面的圆括号中只能有一个形参,但该形参是可选的,所以一般只写异常的类型。但在捕获异常的同时还要利用throw抛出的值,catch就必须带有参数,表示指定变量或类对象。如: catch(int y) cout“throw“y; 如果不想得到一个拷贝值,而是希望获得表达式本身的值,则需把catch的参数声明为引用。如:catch(int

4、 &),1语法格式,try-catch语句的进一步说明: 一个函数可以只有try语句块而无catch语句块,也就是在此函数中只检查并不处理,把catch语句块放在其他函数中。,1语法格式,try-catch语句的进一步说明: 一个try-catch语句中只能有一个try语句块,但却可以有多个catch语句块,以便与不同的异常类型匹配。catch只检查所捕捉异常的类型,并不检查它们的值,这也是为什么对于不同异常throw必须抛出不同类型异常的原因。,1语法格式,try-catch语句的进一步说明: 如果catch语句块的格式为: catch () 异常处理语句 表示捕捉任何类型的异常,但必须放在

5、try-catch结构中的最后,相当于“其他”。如果把它作为第一个catch子句,则后面的catch子句都不起作用。catch ()语句可以单独使用。,1语法格式,try-catch语句的进一步说明: try-catch语句可以与throw出现在同一个函数中,也可以不在同一个函数中。,1语法格式,try-catch语句的进一步说明: C+只处理放在try语句块中的异常,可以理解为这些异常被监控,那些不在监控之中的异常C+是不会处理的。因此对于可能发生异常的程序段,必须放在try语句块中,否则不起作用。 见书中例13.1 、例13.2 、例13.3、例13.4 。,2异常规范,异常规范的语法格式

6、为: 返回值类型 函数名(形参列表) throw (异常类型1,异常类型2,异常类型3,) 如:double divide(int dividend, int divisor) throw (Div_Exception),2异常规范,异常规范只是给出了一个函数抛出异常的范围,在函数体中仍要指定抛出类型,否则异常声明不起作用。 如果一个函数抛出了异常规约范围之外的异常,会调用系统函数unexpected(),从而保证程序的运行。,2异常规范,异常类型为空的异常规范表示函数不抛出任何异常,但该函数仍能抛出异常,而且同样调用系统函数unexpected()。如: double divide(int

7、dividend, int divisor) throw() 不带异常规范的函数可以抛出任何异常。如: double divide(int dividend, int divisor),如果异常类型是类的类型,则可以根据需要自行定义异常类,也可以使用C+标准库中的异常类。 异常类是一个层次结构,即异常类存在继承关系。 见书中例13.5。,13.1.2 异常与继承,构造函数没有返回类型,在其执行过程中出现的错误无法通过返回值来报告运行状态,只有强行终止或通过异常来处理。 如果在初始化类对象时构造函数发生了异常,则该类对象可能只是部分地被构造:一些成员可能已经被初始化,而另外一些成员在异常发生之前

8、还没有被初始化。,13.1.3 构造函数和析构函数的异常处理,如果系统没有完整地创建一个类对象,系统不会调用析构函数来释放它,这样构造函数发生异常前所创建的类对象成员有时不被释放。 构造函数的异常处理方法是:在构造函数发生异常时,需要保证已创建的类对象成员能够被释放,然后才抛出异常。,13.1.3 构造函数和析构函数的异常处理,对于析构函数的异常,可以使用与一般异常同样的方法去处理。但析构函数发生异常时,如果异常之后还有释放类对象成员的语句,这些语句将不会被执行,从而导致内存的泄漏。 析构函数一般不抛出异常。 见书中例13.6。,13.1.3 构造函数和析构函数的异常处理,13.2 命名空间,

9、命名空间的一般定义格式为: namespace /命名空间成员说明 ,13.2.1 命名空间的定义和使用方法,命名空间的作用是建立一些互相分隔的作用域,分隔一些全局实体,避免产生名字冲突。可以根据需要设置许多个命名空间,每个命名空间名标识一个不同的命名空间域,不同的命名空间不能同名。这样,就可以把不同库中的实体放到不同的命名空间中。,命名空间成员的作用域就局限在该命名空间范围内。当在一个命名空间外使用该命名空间的成员时,必须用命名空间名与作用域运算符“:“来限定,即:。,C+允许使用没有名字的命名空间。在无名命名空间中说明的标识符,使用时无法加命名空间名限定,因此在其他文件中无法引用,只能在本

10、文件的作用域内使用它们。如: namespace int x,y; int fun(int a, int b) return a*b; ,命名空间是可以嵌套的,即在一个命名空间的内部定义另外一个命名空间,形成多个层次的作用域。当从外部访问内层命名空间的成员时,需要使用多个作用域运算符。如: namespace rectangle int area; namespace size int length; int width; ,命名空间的定义可以是不连续的,C+允许将同一个命名空间中的定义和声明分开在多个文件里,也可以在同一个文件中分成许多段。命名空间由它的分离定义的总和构成,这些声明和定义最终

11、都属于同一个命名空间。这样就可以随时把新的成员加入到已有的命名空间中去。无名的命名空间可以在给定文件中不连续,但不能跨越文件。 见书中例13.7、例13.8。,利用using语句访问命名空间成员的格式为: using namespace ; 或者 using :;,13.2.2 简化使用命名空间成员,1. 用using语句访问命名空间成员,为命名空间取别名的格式如下: namespace = ; 如: namespace PC = PersonalComputerNamespaceNameUsedinSetProject; 只能给已经定义的命名空间名取别名,如果是未定义的命名空间名字将会出错。

12、 见书中例13.9。,2. 使用命名空间的别名,13.2.3 标准命名空间,为了避免C+标准库中的标识符与程序中的全局标识符之间、不同库中的标识符之间的同名冲突,C+标准库的所有标识符都定义在一个名为std的命名空间中 。,13.2.3 标准命名空间,根据命名空间的定义和其成员的使用方法,使用C+标准库中的任何标识符都可以用以下三种方式: (1) 直接指定标识符 如std:cout、std:cin。程序中的一个完整语句可以是:std:cout 100std:endl;,13.2.3 标准命名空间,(2) 使用using语句 如: using std:cout; using std:endl;

13、有了上面两条语句,(1)中的语句可以写成: cout 100 endl;,13.2.3 标准命名空间,(3)用using语句对命名空间std进行声明 如: #include #include using namespace std; 有了using namespace std;语句对命名空间std的声明,就可以直接访问std命名空间的所有成员,不必对std命名空间中的每个成员一一处理。,13.2.3 标准命名空间,如果按照是否使用命名空间,C+标准库可以分为两类库,两种用法是等价的,可以任选。 与C兼容 使用命名空间std #include #include #include #include using namespace std;,作业题和上机练习题,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号