background image

怎样用好 Java 中的异常抛出

以前,我觉得编程语言中最让人不解的部分就是它能够创建错误。当时我对 Java 语言中
的 throw

关键字的第一反应就是 啊,这也太傻了,为什么我们想要引发一个错误

(error)?”我觉得错误是我的敌人,应当避免的,所以创建错误是毫无用处甚至是危险的 。
我认为在 JavaScript 中加入这样的关键字是多此一举。但随着我编程经验的丰富,我逐
渐变成了 throw 我的 error 粉丝。合理的使用它们会让对代码的调试和维护大大简化。

  在编程的时候,Error 通常出现在不期望的事情发生时。可能是传入函数的参数值不
正确,或者是运算符的操作数不合法。为此编程语言定义了一个基本的规则:当上述情况
发生时,就产生一个错误来让编程人员对代码进行修复。如果这些错误不被抛出或反馈给

你,那么调试程序几乎是不可能的。如果所有的错误都 悄悄地 发生,那么你很难在第一
时间发现问题所在,并将其修复。因此 Error 是开发者的朋友,而不是敌人。

  Error 的问题所在是它们会在错误的时间和错误的地点发生。更糟的是,默认的错误
信息通常晦涩难懂,很难解释哪里出了问题。JavaScirpt 的错误信息更是不包含任何有价
值的信息,而且还很隐蔽(尤其是在 IE 里运行时)。想象一下如果能有这样的错误提示出现

因为某件事情发生导致某个函数调用失败 ,那么立刻我们的调试任务就变得简单了,

这就是 throw 自己的 error 的好处。

  我们可以把 error 想象成内嵌的异常类。在代码的某个特定的地点估计异常的发生肯
定要比在所有的地方等待异常的发生要简单。这不光在代码编写中,在产品设计中也是一
个普遍认同的原则。就像在轿车上设计了挤压区域和框架,以便在受到撞击时会以期望的
方式发生变形。因为知道了框架在受到撞击时会如何变形,哪些零件会失效,这样制造商
就可以造出保证乘客安全的汽车。我们的代码也可以按照这样的思想编写。

    虽 然 最 近 几 年 JavaScript 有 了 很 多 进 步 , 但 是 相 比 于 其 它 语 言 的 开 发 者 ,
JavaScript 开发者仍然只有少得可怜的调试工具。因此在 JavaScript 中 throw error 就
显得比其它语言更有价值。我们可以用 throw 关键字来抛出一个对象。我们可以抛出任何
类型的对象,不过 Error 对象是最常用的:

  throw new Error("Something bad happened.")

  当我们用这样的方式抛出错误,而这个错误又不被 try-catch 捕获时,浏览器就会
用其通常的方式显示上面的错误信息(Something bad happened)。在 IE 里会在浏览器
的左下角出现一个小图标,当双击图标时会弹出一个带着上面错误提示的对话框 ;安装有
Firebug 插 件 的 火 狐 浏 览 器 会 在 控 制 台 显 示 错 误 信 息 ;Safar 和 Chrome 会 在 Web 
Inspector 中显示;Opera 会在错误控制台显示。一句话,它们会像你没有抛出错误时一
样处理。但不同的是它会通过浏览器向你提供具体的信息,而不是一个发生错误的行列号。