异常处理习题-Read7页

上传人:文库****9 文档编号:175513082 上传时间:2021-03-24 格式:DOC 页数:7 大小:33KB
返回 下载 相关 举报
异常处理习题-Read7页_第1页
第1页 / 共7页
异常处理习题-Read7页_第2页
第2页 / 共7页
异常处理习题-Read7页_第3页
第3页 / 共7页
异常处理习题-Read7页_第4页
第4页 / 共7页
异常处理习题-Read7页_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《异常处理习题-Read7页》由会员分享,可在线阅读,更多相关《异常处理习题-Read7页(7页珍藏版)》请在金锄头文库上搜索。

1、7第十章 异常处理习题第十章 异常处理习题一. 基本概念与基础知识自测题10.1 填空题10.1.1 C+程序将可能发生异常的程序块放在 (1) 中,紧跟其后可放置若干对应的 (2) ,在前面所说的块中或块所调用的函数中应该有对应的 (3) ,由它在不正常时抛出 (4) ,如与某一条 (5) 类型相匹配,则执行该语句。该语句执行完后,如未退出程序,则执行 (6) 。如没有匹配的语句,则交C+标准库中的 (7) 处理。答案:(1)try块(2)catch子句(3)throw表达式(4)异常(5)catch子句(6)后面的一条语句(7)terminate()10.1.2 throw表达式的行为有点

2、像函数的 (1) ,而catch子句有点像函数的 (2) 。函数的调用和异常处理的主要区别在于:建立函数调用所需的信息在 (3) 时已经获得,而异常处理机制要求 (4) 时的支撑。对于函数,编译器知道在哪个调用点上函数被真正调用,而对异常处理,异常是 (5) 发生的,并沿 (6) 查找异常处理子句,这与 (7) 多态是 (8) 。答案:(1)调用(2)定义(3)编译(4)运行(5)随机(6)调用链逆向(7)运行时的(8)不一样的10.1.3 异常也适用类的层次结构,与虚函数的规则 (1) ,基类的异常 (2) 派生类异常catch子句处理,而反过来则 (3) 。答案:(1)相反(2)不能被(3

3、)能处理10.1.4 异常处理时与函数重载 (1) ,异常处理是由 (2) catch子句处理,而不是由 (3) catch子句处理,所以catch子句 (4) 是很重要的。答案:(1)解析不同(2)最先匹配到的(3)最佳匹配的(4)排列次序10.2 简答题10.2.1 当在try块中抛出异常后,程序最后是否回到try块中,继续执行后面的语句?答:不会回到try块中。10.2.2 什么叫做栈展开(stack unwinding)?异常在其中按怎样的步骤寻求处理?答:因发生异常而逐步退出复合语句和函数定义,被称为栈展开(stack unwinding)。栈展开才是异常处理的核心技术。寻找匹配的c

4、atch子句有固定的过程:如果throw表达式位于try块中,则检查与try块相关联的catch子句列表,看是否有一个子句能够处理该异常,如果有匹配的,则该异常被处理;如果找不到匹配的catch子句,则在主调函数中继续查找。如果一个函数调用在退出时带有一个被抛出的异常未能处理,而且这个调用位于一个try块中,则检查与该try块相关联的catch子句列表,看是否有一个子句匹配,如果有,则处理该异常;如果没有,则查找过程在该函数的主调函数中继续进行。即这个查找过程逆着嵌套的函数调用链向上继续,直到找到处理该异常的catch子句。只要遇到第一个匹配的catch子句,就会进入该catch子句,进行处理

5、,查找过程结束。10.2.3 为什么C+要求资源的取得最好放在构造函数中,而资源的释放在析构函数中?答:退出调用链时必须释放所有资源。随着栈展开,在退出的复合语句和函数定义中声明的局部变量的生命期也结束了。在栈中分配的局部量占用的资源也被释放,由系统回收。但是如果函数动态获得过资源(包括用new运算符取得的资源和打开的文件),因异常,这些资源的释放语句可能被忽略,则这些资源将永远不会被自动释放。在栈展开期间,当一个复合语句(或语句块)或函数退出时,在退出的域中有某个局部量是类对象,栈展开过程将自动调用该对象的析构函数,完成资源的释放。所以C+异常处理过程本质上反映的是“资源获取是由构造函数实现

6、,而资源释放是由析构函数完成”这样一种程序设计技术。10.2.4 为什么要有异常重新抛出?异常重新抛出与处理的次序及过程是怎样的?答:当catch语句捕获一个异常后,可能不能完全处理异常,在完成某些操作后,catch子句可能决定该异常必须由函数链中更上级的函数来处理,这时catch子句可以重新抛出(rethrow)该异常,把异常传递给函数调用链中更上级的另一个catch子句,由它进行进一步处理。rethrow表达式仍为:throw;但仅有一个关键字,因为异常类型在catch语句中已经有了,不必再指明。被重新抛出的异常就是原来的异常对象。但是重新抛出异常的catch子句总是做了些工作,也应该把自

7、己做过的工作告诉下一个处理异常的catch子句,所以往往要对异常对象做一定修改,以表达某些信息,这时catch子句中的异常声明必须被声明为引用(参见上节),这样修改才能真正在异常对象自身中,而不是在拷贝中进行。10.2.5 什么是异常规范? 答:异常规范(exception specification)提供了一种方案,可以随着函数声明列出该函数可能抛出的异常,并保证该函数不会抛出任何其他类型的异常。10.2.6 当异常被组织成类层次结构时,对应catch子句应怎样排列?为什么?答:在处理类类型异常时,catch子句的排列顺序是非常重要的。当异常被组织成类层次结构时,类类型的异常可以被该类类型的

8、公有基类的catch子句捕获到。为了保证异常的处理由最合适的catch子句来处理,派生类类型的catch子句必须先出现,以确保只有在没有其他catch子句适用时,才会进入基类类型的catch子句。10.2.7 简述C+标准库的异常类层次结构。答:C+标准库中的异常层次的根类被称为exception,定义在库的头文件中,它是C+标准库函数抛出的所有异常类的基类。C+标准库还提供了一些类,可用在用户编写的程序中,以报告程序的不正常情况。这些预定义的错误被分为两大类:逻辑错误(logic error)和运行时错误(run_time error)。逻辑错误是那些由于程序的内部逻辑而导致的错误或者违反了

9、类的不变性的错误。逻辑异常包括:invalid_argment异常,如果函数接收到一个无效的实参,就会抛出该异常。out_of_range异常,如果函数接收到一个不在预期范围中的实参,则抛出该异常。length_error异常,用以报告企图产生一个“长度值超出最大允许值”的对象。domain_error异常,用以报告域错误(domain error)。与此相对,运行时刻错误是由于程序域之外的事件而引起的错误。运行时刻错误只在程序执行时才是可检测的。运行时异常包括:range_error异常,报告内部计算中的范围错误。overflow_error异常,报告算术溢出错误。underflow_err

10、or异常,报告算术下溢错误。以上三个异常是由runtime_error类派生的。bad_alloc异常。当new()操作符不能分配所要求的存储区时,会抛出该异常。它是由基类exception派生的。二. 编程与综合练习题10.3 利用C+标准库的异常类结构,为顺序栈【例7.6】添加异常处理机构。栈满时的处理是把栈空间加倍,原栈内容拷入之后,再压栈。解:未用利用C+标准库的异常类结构,可由学生自己替换。#includeusing namespace std;templateclass pushOnFullT _value;public:pushOnFull(T i)_value=i;T valu

11、e()return _value;void print()cerr栈满,value()未压入栈,栈需加倍.endl;templateclass popOnEmptypublic:void print()cerr栈已空,无法出栈endl;templateclass stackfailpublic:void print()cerr栈空间无法加倍,请按任意键退出endl;templateclass Stackint top; /栈顶指针(下标)T *elements; /动态建立的数值int maxSize; /栈最大允纳的元素个数public:Stack(int=20); /栈如不指定大小,设为2

12、0元素Stack()delete elements;void Push(const T &data); /压栈T Pop(); /弹出,top-T GetElem(int i)return elementsi; /返回指定元素,top不变void MakeEmpty()top= -1; /清空栈bool IsEmpty() constreturn top= -1; /判栈空bool IsFull() constreturn top=maxSize-1; /判栈满void PrintStack(); /输出栈内所有数据void StackFull();template Stack:Stack(i

13、nt maxs)maxSize=maxs;top=-1;elements=new T maxSize; /建立栈空间template void Stack:PrintStack()for(int i=0;i=top;i+) coutelementsit;coutendl;template void Stack:Push(const T &data)if(IsFull() throw pushOnFull(data); /栈满则抛出异常elements+top=data; /栈顶指针先加1,元素再进栈,top是指向栈顶元素templateT Stack:Pop()if(IsEmpty() throw popOnEmpty(); /栈已空则不能退栈,抛出异常return elementstop-;/返回栈顶元素,同时栈顶指针退1template void Stack:StackFull()/堆栈加倍T * el=elements;int i=maxSize,j;maxSize*=2; /加倍栈空间if(maxSize=32)elements=new T maxSize;/条件语句是为了演示分配不成功

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

当前位置:首页 > 办公文档 > 其它办公文档

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