- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章异常处理习题-Read.doc
第十章 异常处理习题
基本概念与基础知识自测题
填空题
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表达式的行为有点像函数的 (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)能处理
10.1.4 异常处理时与函数重载 (1) ,异常处理是由 (2) catch子句处理,而不是由 (3) catch子句处理,所以catch子句 (4) 是很重要的。
答案:(1)解析不同
(2)最先匹配到的
(3)最佳匹配的
(4)排列次序
简答题
当在try块中抛出异常后,程序最后是否回到try块中,继续执行后面的语句?
答:不会回到try块中。。
什么叫做栈展开(stack unwinding)?异常在其中按怎样的步骤寻求处理?
答:因发生异常而逐步退出复合语句和函数定义,被称为栈展开(stack unwinding)。栈展开才是异常处理的核心技术。
寻找匹配的catch子句有固定的过程:如果throw表达式位于try块中,则检查与try块相关联的catch子句列表,看是否有一个子句能够处理该异常,如果有匹配的,则该异常被处理;如果找不到匹配的catch子句,则在主调函数中继续查找。如果一个函数调用在退出时带有一个被抛出的异常未能处理,而且这个调用位于一个try块中,则检查与该try块相关联的catch子句列表,看是否有一个子句匹配,如果有,则处理该异常;如果没有,则查找过程在该函数的主调函数中继续进行。即这个查找过程逆着嵌套的函数调用链向上继续,直到找到处理该异常的catch子句。只要遇到第一个匹配的catch子句,就会进入该catch子句,进行处理,查找过程结束。
为什么C++要求资源的取得最好放在构造函数中,而资源的释放在析构函数中?
答:退出调用链时必须释放所有资源。随着栈展开,在退出的复合语句和函数定义中声明的局部变量的生命期也结束了。在栈中分配的局部量占用的资源也被释放,由系统回收。但是如果函数动态获得过资源(包括用new运算符取得的资源和打开的文件),因异常,这些资源的释放语句可能被忽略,则这些资源将永远不会被自动释放。
在栈展开期间,当一个复合语句(或语句块)或函数退出时,在退出的域中有某个局部量是类对象,栈展开过程将自动调用该对象的析构函数,完成资源的释放。所以C++异常处理过程本质上反映的是“资源获取是由构造函数实现,而资源释放是由析构函数完成”这样一种程序设计技术。
为什么要有异常重新抛出?异常重新抛出与处理的次序及过程是怎样的?
答:当catch语句捕获一个异常后,可能不能完全处理异常,在完成某些操作后,catch子句可能决定该异常必须由函数链中更上级的函数来处理,这时catch子句可以重新抛出(rethrow)该异常,把异常传递给函数调用链中更上级的另一个catch子句,由它进行进一步处理。rethrow表达式仍为:
throw;
但仅有一个关键字,因为异常类型在catch语句中已经有了,不必再指明。被重新抛出的异常就是原来的异常对象。但是重新抛出异常的catch子句总是做了些工作,也应该把自己做过的工作告诉下一个处理异常的catch子句,所以往往要对异常对象做一定修改,以表达某些信息,这时catch子句中的异常声明必须被声明为引用(参见上节),这样修改才能真正在异常对象自身中,而不是在拷贝中进行。
什么是异常规范?
答:异常规范(exception specification)提供了一种方案,可以随
文档评论(0)