1.8 异常处理:应对错误

从程序设计语言出现开始,错误处理就是最难的问题之一。因为设计一个好的错误处理方案非常困难,许多语言忽略这个问题,将这个问题转交给库的设计者,而库的设计者往往采取不彻底的措施,即可以在许多情况下起作用,但很容易被绕开,通常是被忽略。大多数错误处理方案的一个主要问题,在于一相情愿地认为程序员会小心地遵循一些语言本身并不强制要求而是商定好的规范。如果程序员不够小心(这种情况在他们非常匆忙的时候经常发生),这些方案就会很容易被忘记。

异常处理(exception handling)将错误处理直接与程序设计语言甚至有时是操作系统联系起来。异常是一个对象,它在出错的地方抛出,并且被一段用以处理特定类型错误的、相应的异常处理代码(exception handler)所捕获。异常处理似乎是另一个并行的执行路径,在出错的时候被调用。由于它使用一个单独的执行路径,它不需要干涉正常的执行代码。因为不需经常检查错误,代码可以很简洁。另外,一个抛出的异常并不同于一个由函数返回的错误值或为了指出错误条件而由函数设置的标记,后两者可以被忽略,而异常不能被忽略,必须保证它们在某些点上进行处理。最后,异常提供了一个从错误状态中进行可靠恢复的方法。除了从这个程序中退出以外,我们常常还可以作出正确的设置,并且恢复程序执行,这有助于产生更健壮的系统。

异常处理并不是面向对象的一个特性,尽管在面向对象语言中异常通常用一个对象表示。异常处理的出现早于面向对象语言。

异常处理在本卷中介绍得很少且很少使用;第2卷详尽讨论了异常处理。