C++第十章习题解答.doc

上传人:wux****ua 文档编号:8800915 上传时间:2020-04-01 格式:DOC 页数:7 大小:35KB
返回 下载 相关 举报
C++第十章习题解答.doc_第1页
第1页 / 共7页
C++第十章习题解答.doc_第2页
第2页 / 共7页
C++第十章习题解答.doc_第3页
第3页 / 共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表达式的行为有点像函数的 (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)排列次序10.2 简答题10.2.1 当在try块中抛出异常后,程序最后是否回到try块中,继续执行后面的语句?答:不会回到try块中。10.2.2 什么叫做栈展开(stack unwinding)?异常在其中按怎样的步骤寻求处理?答:因发生异常而逐步退出复合语句和函数定义,被称为栈展开(stack unwinding)。栈展开才是异常处理的核心技术。寻找匹配的catch子句有固定的过程:如果throw表达式位于try块中,则检查与try块相关联的catch子句列表,看是否有一个子句能够处理该异常,如果有匹配的,则该异常被处理;如果找不到匹配的catch子句,则在主调函数中继续查找。如果一个函数调用在退出时带有一个被抛出的异常未能处理,而且这个调用位于一个try块中,则检查与该try块相关联的catch子句列表,看是否有一个子句匹配,如果有,则处理该异常;如果没有,则查找过程在该函数的主调函数中继续进行。即这个查找过程逆着嵌套的函数调用链向上继续,直到找到处理该异常的catch子句。只要遇到第一个匹配的catch子句,就会进入该catch子句,进行处理,查找过程结束。10.2.3 为什么C+要求资源的取得最好放在构造函数中,而资源的释放在析构函数中?答:退出调用链时必须释放所有资源。随着栈展开,在退出的复合语句和函数定义中声明的局部变量的生命期也结束了。在栈中分配的局部量占用的资源也被释放,由系统回收。但是如果函数动态获得过资源(包括用new运算符取得的资源和打开的文件),因异常,这些资源的释放语句可能被忽略,则这些资源将永远不会被自动释放。在栈展开期间,当一个复合语句(或语句块)或函数退出时,在退出的域中有某个局部量是类对象,栈展开过程将自动调用该对象的析构函数,完成资源的释放。所以C+异常处理过程本质上反映的是“资源获取是由构造函数实现,而资源释放是由析构函数完成”这样一种程序设计技术。10.2.4 为什么要有异常重新抛出?异常重新抛出与处理的次序及过程是怎样的?答:当catch语句捕获一个异常后,可能不能完全处理异常,在完成某些操作后,catch子句可能决定该异常必须由函数链中更上级的函数来处理,这时catch子句可以重新抛出(rethrow)该异常,把异常传递给函数调用链中更上级的另一个catch子句,由它进行进一步处理。rethrow表达式仍为:throw;但仅有一个关键字,因为异常类型在catch语句中已经有了,不必再指明。被重新抛出的异常就是原来的异常对象。但是重新抛出异常的catch子句总是做了些工作,也应该把自己做过的工作告诉下一个处理异常的catch子句,所以往往要对异常对象做一定修改,以表达某些信息,这时catch子句中的异常声明必须被声明为引用(参见上节),这样修改才能真正在异常对象自身中,而不是在拷贝中进行。10.2.5 什么是异常规范? 答:异常规范(exception specification)提供了一种方案,可以随着函数声明列出该函数可能抛出的异常,并保证该函数不会抛出任何其他类型的异常。10.2.6 当异常被组织成类层次结构时,对应catch子句应怎样排列?为什么?答:在处理类类型异常时,catch子句的排列顺序是非常重要的。当异常被组织成类层次结构时,类类型的异常可以被该类类型的公有基类的catch子句捕获到。为了保证异常的处理由最合适的catch子句来处理,派生类类型的catch子句必须先出现,以确保只有在没有其他catch子句适用时,才会进入基类类型的catch子句。10.2.7 简述C+标准库的异常类层次结构。答:C+标准库中的异常层次的根类被称为exception,定义在库的头文件中,它是C+标准库函数抛出的所有异常类的基类。C+标准库还提供了一些类,可用在用户编写的程序中,以报告程序的不正常情况。这些预定义的错误被分为两大类:逻辑错误(logic error)和运行时错误(run_time error)。逻辑错误是那些由于程序的内部逻辑而导致的错误或者违反了类的不变性的错误。逻辑异常包括:invalid_argment异常,如果函数接收到一个无效的实参,就会抛出该异常。out_of_range异常,如果函数接收到一个不在预期范围中的实参,则抛出该异常。length_error异常,用以报告企图产生一个“长度值超出最大允许值”的对象。domain_error异常,用以报告域错误(domain error)。与此相对,运行时刻错误是由于程序域之外的事件而引起的错误。运行时刻错误只在程序执行时才是可检测的。运行时异常包括:range_error异常,报告内部计算中的范围错误。overflow_error异常,报告算术溢出错误。underflow_error异常,报告算术下溢错误。以上三个异常是由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 value()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); /栈如不指定大小,设为20元素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(int 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;/条件语句是为了演示分配不成功else elements=NULL;if(elements=NULL) throw stackfail(); /分配不成功抛出异常for(j=0;ji;j+) elementsj=elj;delete el;int main()int a20=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, b20=0,i;Stackistack(4);for(i=0;i20;i+)tryistack.Push(ai);/到a4,a8,a16时栈满,异常catch(pushOnFull&eObj)eObj.print();tryistack.StackFull();catch(stackfail&eObj)eObj.print();cin.get();return -1;istack.Push(eObj.value();istack.PrintStack();cout数据出栈:endl;tryfor(i=0;i21;i+)bi=istack.Pop();coutbit;coutendl;catch(popOnEmpty&eObj) eObj.print();tryfor(i=0;i41;i+)istack.Push(ai%20);coutai%20t;catch(pushOnFull&eObj)eObj.print();tryistack.StackFull();catch(stackfail&eObj)eObj.print();cin.get();return -1;istack.Push(eObj.value();return 0;10.4 在【例8.9】中,当被积函数中出现被0除现象时,应抛出一个异常,但不退出主函数,可进行下一个定积分计算。解:利用C+标准库的异常类结构#include#include#include /采用C+标准库中的异常类#include#includeusing namespace std;const double DefaultOverflow=1.0E10;class Simpsondouble Intevalue,a,b; /Intevalue积分值,a积分下限,b积分上限public:virtual double fun(double x)=0; /被积函数声明为纯虚函数Simpson(double ra=0,double rb=0)a=ra;b=rb;Intevalue=0;void Integrate()double dx;int i;dx=(b-a)/2000;Intevalue=fun(a)+fun(b);for(i=1;i2000;i+=2)Intevalue+=4*fun(a+dx*i);for(i=2;i2000;i+=2)Intevalue+=2*fun(a+dx*i);Intevalue*=dx/3;void Print()cout积分值=Intevalueendl;class A:public Simpsonpublic:A(double ra,double rb):Simpson(ra,rb);double fun(double x)double temp;temp=1/x;if(fabs(temp)DefaultOverflow) return temp;elsestring eObj=因被积函数发生算术溢出(被0除),跳过;throw overflow_error(eObj);class B:public Simpsonpublic:B(double ra,double rb):Simpson(ra,rb);double fun(double x)double temp;temp=exp(x);if(fabs(temp)Integrate();s-Print();/动态catch(overflow_error &excp)cerrexcp.what()endl;B b1(0.0,1.0);tryb1.Integrate();b1.Print();/静态catch(overflow_error &excp)cerrexcp.what()endl;return 0;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!