C C++语言程序设计(西电版)第14章 异常处理.ppt_第1页
C C++语言程序设计(西电版)第14章 异常处理.ppt_第2页
C C++语言程序设计(西电版)第14章 异常处理.ppt_第3页
C C++语言程序设计(西电版)第14章 异常处理.ppt_第4页
C C++语言程序设计(西电版)第14章 异常处理.ppt_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、第十四章 异常处理,C/C+语言程序设计,龚尚福,贾澎涛主编 C/C+语言程序设计 西安电子科技大学出版社,第十四章 异常处理,14.1 异常处理机制 14.2 异常处理的实现 14.3 异常规范 14.4 小结,14.1异常处理机制,C+语言异常处理机制的基本思想是将异常的检测与处理分离。当在一个函数体中检测到异常条件存在,但却无法确定相应的处理方法时,该函数将引发一个异常,由函数的直接或间接调用者捕获这个异常并处理这个错误。如果程序始终没有处理这个异常,最终它会被传到C+运行系统那里,运行系统捕获异常后,通常只是简单地终止这个程序。 由于异常处理机制使得异常的引发和处理不必在同一函数中。这

2、样,底层的函数可以着重解决具体问题而不必过多地考虑对异常的处理;上层调用者可以在适当的位置设计对不同类型异常的处理。,14.2异常处理的实现,C+的异常处理机制通过throw、try和catch三个语句来实现。一般情况下,被调用函数直接检测到异常处理条件的存在,并使用throw引发一个异常;在上层函数中,使用try监测函数确定是否引发异常;检测到的各种异常由catch捕获并作出相应的处理,从而使程序从这些异常事件中恢复过来。,14.2.1 异常处理的语法,throw语法 try语法,throw ;,try 复合语句 ,3.catch语法,catch(异常类型1 参数1) 复合语句1 /针对异常

3、类型1的处理语句 catch(异常类型2 参数2) 复合语句2 /针对异常类型2的处理语句 catch(异常类型n 参数n) 复合语句n /针对异常类型n的处理语句 ,14.2.2 异常处理的执行过程,通过正常的顺序执行到达try语句,然后执行try块内的保护段。 如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句不执行。程序从try块后面跟随的最后一个catch语句之后的语句继续执行下去。 如果在保护段执行期间或在保护段调用的任何函数中(直接或间接的调用)有异常被抛出,则通过throw创建一个异常对象(这隐含指可能包含一个拷贝构造函数)。,在此处,编译器在执行代码中寻找一个

4、能够处理抛掷类型异常的catch处理程序(或一个能处理任何类型异常的catch处理程序)。catch处理程序按其在try块后出现的顺序被检查。如果没有找到合适的处理程序,则继续检查下一个动态封闭的try块查。此处理继续下去,直到最外层的封闭try块被检查完。 如果匹配的处理程序未找到,则函数terminate()被自动调用,该函数的默认功能是终止程序。 如果找到一个匹配的catch处理程序,且它通过值进行捕获,则其形参通过拷贝异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化为指向异常对象在形参被初始化之后,“循环展开栈”的过程开始。 例14.1 处理零异常。,catch处理程序的出现

5、顺序很重要,因为在一个try块中,异常处理程序是按照它出现的顺序被检查的。只要找到一个匹配的异常类型,后面的异常处理都将被忽略。例如,在下面的异常处理块中,首先出现的是catch(),它可以捕获任何异常,在任何情况下,其他的catch语句都不被检查。因此,catch()应该放在最后。,Try / catch() /只在这里处理所有的异常, /后面的异常处理程序段不会被检查 catch(const char *str) / catch(int) / ,14. 3 异常规范,异常规范(Exception Specification )提供了一种方案:它能够随着函数声明列出该函数可能抛出的异常,它保

6、证该函数不会抛出任何其他类型的异常。异常规范跟随在函数参数表之后,它由关键字throw 来指定,后面是用括号括起来的异常类型表。其语法格式为:,值类型 函数名(形参表) throw(类型名表) 函数体,例如可以按如下方式给出iStack 类的成员函数的声明以增加适当的异常规范: class iStack public: / . void pop( int ,如果函数声明指定了一个异常规范,则同一函数的重复声明必须指定同一类型的异常规范,同一函数的不同声明上的异常规范是不能累积的。例如 / 同一函数的两个声明 extern int foo( int parm ) throw(string); /

7、 错误: 异常规范被省略 extern int foo( int parm ) ,如果函数抛出了一个没有被列在异常规范中的异常会怎么样?程序只有在遇到某种不正常情况时异常才会被抛出。在编译时刻编译器不可能知道在执行时程序是否会遇到这些异常。因此一个函数的异常规范的违例只能在运行时刻才能被检测出来。如果函数抛出了一个没有被列在其异常规范中的异常,则系统调用C+标准库中定义的函数unexpected()。,unexpected()的缺省行为是调用terminate()。在某些条件下可能有必要改变unexpected()执行的动作,C+标准库提供了一种机制可让我们改变unexpected()的缺省行为: (1)空的异常规范保证函数不会抛出任何异常,例如函数no_problem()保证不会抛出任何异常。 extern void no_problem() throw(); (2)如果一个函数声明没有指定异常规范,则该函数可以抛出任何类型的异常。在被抛出的异常类型与异常规范中指定的类型之间不允许类型转换。,(3)也可以在函数指针的声明处给出一个异常规范,例如: void (*pf) (int) throw(string); 该声明表示pf 是一个函数指针,它只能抛出string 类型的异常。和函数声明一样,同一指针的不同异常规范不能累积

温馨提示

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

评论

0/150

提交评论