异常处理的进一步讨论_第1页
异常处理的进一步讨论_第2页
异常处理的进一步讨论_第3页
异常处理的进一步讨论_第4页
异常处理的进一步讨论_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

关于异常处理的进一步讨论异常规范堆栈解退构造函数、析构函数与异常处理异常规范

在C++中,可以使用异常规范对函数定义进行限定,指出它将引发那些类型的异常。它的一般格式如下所示:函数返回值函数名(形参列表)throw(异常类型类表){

函数体}格式说明:可在函数定义的后面加上关键字throw和异常类型类表组成,异常类型类表被括在括号中,并用逗号分隔。例如:doubleFunc1(doublea,doubleb)throw(bad_hmean){

函数体}doubleFunc2(doublea,doubleb)throw(constchar*,double){

函数体}

代码说明:上述代码告诉编译器,该函数引发那些类型的异常。如果以后该函数引发了其它类型的异常,程序将调用abort()函数,对这种越权作出反应如果异常规范中的括号内为空,则表明该函数不会引发异常,例如:doubleFunc1(doublea,doubleb)throw(){

函数体}原则上,异常规范应包含函数调用的其他函数引发的异常。例如,如果Func1()调用了Func2()函数,而后者可能引发某个对象异常,则Func1()和Func2()的异常规范中都应包含对象异常。堆栈解退

C++通常将调用函数的指令的地址(返回地址)放到堆栈中,当被调用的函数执行完毕后,程序将使用该地址来确定从哪里开始继续执行。另外,函数调用将函数参数放到堆栈中。如果被调用的函数创建了新的自动变量,也将被添加到堆栈中。如果被调用的函数调用了另一个函数,则后者的信息将被添加到堆栈中,依此类推。当函数结束时,程序流程将跳到该函数被调用时存储的地址处,同时释放堆栈顶端的元素。同时每个函数都在结束时释放其自动变量,如果是类对象,则将调用析构函数(如果存在)。假设函数由于出现异常(而不是由于返回)而终止,则程序也将释放堆栈中的内存,但不会在释放堆栈的第一个返回地址后停止,而是继续释放堆栈,直到找到一个位于try块中的返回地址。随后,控制权将转到块尾的异常处理程序,而不是函数调用后的第一条语句。这个过程被称为堆栈解退。异常处理机制和函数返回一样,对于堆栈中的自动类对象,类的析构函数将被调用。不过,函数返回仅仅处理该函数放在堆栈中的对象,而throw语句则处理try块和throw之间整个函数调用序列放在堆栈中的对象。这是异常处理机制一个非常重要的特性。构造函数、析构函数与异常处理

构造函数和析构函数分别管理对象的建立和释放,负责对象的诞生和死亡的过程。当一个对象诞生时,构造函数负责创建并初始化对象的内部环境,包括分配内存、创建内部对象和打开相关的外部资源,等等。而当对象死亡时,析构函数负责关闭资源、释放内部的对象和已分配的内存。在C++语言中,一个对象在创建的过程中可能发生异常问题,那这个对象就不是一个完整的对象,就根本不存在析构或释放的说法。因此,C++在执行构造函数过程中产生异常时,是不会调用对象的析构函数的,而仅仅清理和释放产生异常前的那些C++管理的变量空间等,之后就把异常抛给程序员处理。构造函数中抛出异常时,对抛出异常之前要构造的对象调用析构函数。抛出异常之前每个try块中构造的自动对象都调用析构函数。异常在开始执行处理器时处理,这时堆栈解退一定已经完成。如果堆栈解退调用析构函数而抛出异常,则调用terminate。如果对象有成员函数,且如果异常在外层对象构造完成之前抛出,则执行发生异常之前所构造成员对象的析构函数。如果发生异常时部分构造了对象数组,则只调用已构造数组元素的析构函数。

异常可能越过通常释放资源的代码,从而造成资源泄漏。要解决这个问题,一种方法是在请求资源时初始化一个局部对象,发生异常时,调用析构函数并释放资源。要捕获析构函数中抛出的异常,可以将调用析构函数的函数放在try块中,并提供相应类型的catch处理器。所抛出对象的析构函数在异常处理器执行完毕之后执行。对于构造函数中的异常,需要注意一下几点:(1)C++中通知对象构造失败的唯一方法那就是在构造函数中抛出异常;(2)构造函数中抛出异常将导致对象的析构函数不被执行;(3)当对象发生部分构造时,已经构造完毕的子对象将会逆序地被析构。而对于析构函数中的异常,则需要注意以下几点:(1)C++中析构函数的执行不应该抛出异常;(2)假如析构函数中抛出了异

温馨提示

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

评论

0/150

提交评论