异常处理习题-Read(共7页).doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《异常处理习题-Read(共7页).doc》由会员分享,可在线阅读,更多相关《异常处理习题-Read(共7页).doc(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上第十章 异常处理习题一. 基本概念与基础知识自测题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)。栈展开才是异常处理的核心技术。寻找匹配
4、的catch子句有固定的过程:如果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_e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 异常 处理 习题 Read
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内