2.8 例外处理(2)
例2-66
如果new或new[]不能分配所请求的存储空间,将抛出一个bad_alloc例外。使用new 或new[]的函数可以通过如下方式检测存储空间的分配是否失败
|
常量EXIT_FAILURE在头文件cstdlib中定义。
下面的例子演示一个函数是如何抛出例外的。
例2-67
|
|
如果例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)代码本身产生的例外(这种例外称为同步例外)。



