13.20 自测练习答案
13.1 内存不足以满足 new 的请求、数组下标超界、运算溢出、除数为 0、无效函数参数。
13.2 (a)异常处理是用于处理不常发生的情况,通常在程序准备终止时使用。因此,C++ 编译器的编写人员不像对正常应用程序代码一样对其实现最优化性能。(b)使用传统控制结构的控制流通常比使用异常更清晰更有效。(c)另一危险是堆栈解退,异常发生之前分配的资源可能无法释放。(d)这些“增加的”异常可能打乱真正的错误类型异常。程序员更难跟踪异常种类。例如,程序处理大量异常时,无法确定catch(...)捕获的是什么异常。
13.3 库函数很难满足用户特殊需求的错误处理。
13.4 退出程序会使其他程序无法使用其资源,从而造成资源泄漏。
13.5 忽略该时块的异常处理器(catch 块中),程序在最后一个catch块后重新执行。
13.6 try 块之外抛出的异常会使程序终止。
13.7 catch(…) 能捕获时块中抛出的所有错误。其优点是可以捕获所有错误,缺点是catch没有参数,无法引用抛出的所有错误中的信息,无法知道错误原因。
13.8 这时匹配搜索会继续到外面一层try块。这个过程一直继续,也许最终还是没有任何匹配的异常处理器。这时调用 terminate(默认调用 abort 终止程序)。可以用set_terminate 的参数提供另一 terminate 函数。
13.9 执行时块后面第一个匹配的异常处理器。
13.10 这样可以很好地捕获相关类型的异常。
13.11 可以用一个异常类和catch处理器处理一组异常。发生每个异常时,可以生成具有不同private数据的异常对象。catch 处理器通过检查private数据区分异常的类型。
13.12 void*。
13.13 要求标准转换的处理器可能出现在具有准确匹配的处理器之前。
13.14 不一定,但它终止抛出异常的块。
13.15 异常由导致异常的 catch 处理器所在 try 块(如果有)的相关catch处理器(如果有)处理。
13.16 再抛出异常。
13.17 提供从函数可抛出异常类型的异常指定表。
13.18 调用函数 unexpected。
13.19 通过堆栈解退过程,调用每个对象的析构函数。