2.8 例外处理(2)

2013-10-07 15:29:26 · 作者: · 浏览: 58

2.8   例外处理(2)

例2-66

如果new或new[]不能分配所请求的存储空间,将抛出一个bad_alloc例外。使用new 或new[]的函数可以通过如下方式检测存储空间的分配是否失败

 

常量EXIT_FAILURE在头文件cstdlib中定义。

下面的例子演示一个函数是如何抛出例外的。

例2-67

 
调用access的函数可以通过检查例外来判断是否发生了上溢或下溢:
 

如果例2-67中的函数access抛出的是一个string类型的例外,那么g的catch程序块将无法捕捉该例外,因为捕捉器接受的参数类型为int。一般来说,一个函数如果抛出一个没有被任何捕捉器捕获到的例外,该例外将由系统调用函数unexpected来处理。unexpected函数是一个默认的例外处理器,它处理所有不被任何catch程序块捕获的例外。函数unexpected通常显示一条错误信息,并终止该程序。

在catch块中使用不带参数的throw可将例外重新抛出。

例2-68

代码

 

演示了如何重新抛出一个例外。在打印一条信息后,catch程序块重抛该例外,例外还是原来的类型:out_of_range。

C语言中,异常情况通常通过函数的返回值获得。例如,如果malloc分配存储空间失败,那么它将返回NULL(0),这种异常通告机制的缺陷是:函数调用者必须检测返回值,否则无论是否存在严重错误,程序都将继续执行。在C++(www.cppentry.com)中,当一个函数抛出例外时,即使函数调用者没有使用try和catch程序块,例外还是会被处理,即由系统调用默认处理函数unexpected来执行。

在7.2节中讨论的断言机制提供另一种处理例外的方法。断言要求某个判定式必须成立,否则不再继续执行程序;如果判定式不成立,就意味着代码是错误的。断言不提供错误恢复机制,主要用于程序调试,而例外处理主要解决运行期错误。

C++(www.cppentry.com)通过头文件csignal提供了另一种处理例外的方法,可以处理某些特定类型的例外(见R. Johnsonbaugh和M. Kalin合著的《Applications Programming in ANSI C》第3版),如键盘中断(这种例外称为异步例外)等例外。而throw和catch机制主要用于处理C++(www.cppentry.com)代码本身产生的例外(这种例外称为同步例外)。