13.21 自助练习题
13.20 列出文中所列的程序中发生的各种异常条件,尽量多列几个异常条件。对每个异常条件,简单描述程序如何用本章介绍的异常处理方法处理这个异常。典型的异常有:内存不足以满足new的请求、数组下标超界、运算溢出、除数为 0、无效函数参数。
13.21 什么情况下程序员在定义处理器捕获对象类型时不提供参数名?
13.22 程序包含下列语句:
throw;
这种语句通常出现在什么地方?如果出现在其他地方,会发生什么情况?
13.23 下列语句通常出现在什么情况下?
catch(...){throw};
13.24 比较异常处理与各种其他错误处理方法。
13.25 列出异常处理比传统错误处理方法的优势。
13.26 说明为什么不宜用异常作为程序控制的替换方法。
13.27 说明处理相关异常的方法。
13.28 到本章为止,我们发现处理构造函数所发现的错误比较麻烦。异常处理提供了处理这种错误更好的办法。考虑String类的构造函数。这个构造函数用new取得自由空问。假设new操作失败,说明不用异常时如何处理这种情况,讨论关键点。说明使用异常时如何处理这种情况。说明异常处理的优点在哪里。
13.29 假设程序抛出异常,开始执行相应的异常处理器。再假设异常处理器本身抛出相同的异常。这样会生成无穷递归吗?编写一个C++程序,测试得出的结论。
13.30 用继承方法生成异常基类和各种派生类。然后显示指定基类的catch处理器能捕获派生类的异常。
13.31 列出返回double或int的条件异常。提供一个int catch处理器和一个double catch处理器。
说明不管返回double或int,都只执行double catch处理器。
13.32 编写一个C++程序,产生和处理内存溢出错误。程序通过运算符new循环请求生成动态存储空间。
13.33 编写一个C++程序列出调用块中构造的所有对象的析构函数之后再从块中抛出异常。
13.34 编写一个C++程序,演示只调用发生异常之前构造的成员对象的成员对象析构函数。
13.35 编写一个C++程序,演示catch(...)如何捕获任何异常。
13.36 编写一个C++程序,表明异常处理器的顺序很重要。执行的是第一个匹配的异常处理器。编译和运行程序,显示执行不同异常处理器时的不同效果。
13.37 编写一个C++程序,表明构造函数传递构造失败信息给try块后面的异常处理器。
13.38 编写一个C++程序,用异常类的多重继承层次生成要考虑异常处理器顺序的情况。
13.39 用setjmp/Iongjmp时,程序可以立即从深层嵌套函数调用将控制转移到错误程序。但由于堆栈解退,不能调用嵌套函数调用期间生成的自动对象的析构函数。编写一个C++程序,演示的确没有调用嵌套函数调用期间生成的自动对象的析构函数。
13.40 编写一个C++程序,演示再抛出异常。
13.41 编写一个C++程序,用set_unexpected对unexpected设置用户自定义函数,再次用set_unexpected,然后将unexpected复位为原先的函数。编写一个C++程序,测试set_terminate和terminate。
13.42 编写一个C++程序,显示本身有时块的函数不必捕获try块中产生的每个错误。有些错误留给外层范围处理。
13.43 编写一个C++程序,从深层嵌套函数调用抛出错误,并让调用链所在try块后面的catch处理器捕获这个异常。