自从有编程语言起,错误处理就是一项极为困难的工作。设计一个优秀的错误处理系统是如此困难,以至于许多编程语言忽视了这个问题,而将问题抛给库的设计者。这些设计者只能采取一些折中措施来填补漏洞,这些举措虽然在很多场景中有效,但很容易通过忽略提示的错误而轻易绕过。大多数错误处理方案存在的一个显著的问题是,这些方案并非编程语言强制要求的,而是依赖于程序员同意并遵守相关约定。如果遇到警惕性不高的程序员(通常都是因为需要赶进度而放松了警惕),这些方案就形同虚设了。
异常处理 则是将编程语言甚至是操作系统和错误处理机制直接捆绑在一起。异常是从错误发生之处“抛出”的对象,而根据错误类型,它可以被对应的异常处理程序所“捕获”。而每当代码出现错误时,似乎异常处理机制会使用一条特殊的、并行的执行路径来处理这些错误。这是因为它确实采取了一条单独的运行路径,所以不影响正常执行的代码。同时这一点也降低了你编写代码的成本,因为你不用经常反复检查各种错误了。此外,抛出的异常也不同于方法返回的错误值或者方法设置的错误标识,因为这两者是可以被忽略的,但是异常不允许被忽略,所以这就确保了异常一定会在必要的时候被处理。最后,异常为我们提供了一种可以让程序从糟糕的情况中恢复过来的方法。即便发生了意外,我们也还有机会修正问题以及让程序重新恢复运行,而不是只能结束程序了事,而这一点无疑会增强许多程序的稳健性。
由于从一开始Java就会让你接触到异常处理,并且强制你必须使用它,这就使得Java的异常处理机制在众多编程语言之中显得十分突出,同时这也是Java唯一允许的报错方式。如果你的代码没有正确地处理各种异常,就会得到一条编译时的报错消息。这种有保障的一致性使得错误处理的工作简单了许多。
值得我们留意的是,虽然面向对象语言里的异常一般用对象的形式来呈现,异常处理却并不是面向对象语言的特性。其实,异常处理远在面向对象语言诞生之前就已经存在了。