以前,我觉得编程语言中最让人不解的局部就是它可以创建错误。事先我对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会在错误控制台显示。一句话,它们会像你没有抛出错误时一样处理。但不同的是它会经过阅读器向你提供具体的信息,而不是一个发作错误的行列号。宝拉珍选官网你可以为错误信息加入任何需要的信息,来帮你成功处理效果。我建议在错误信息中提供发作错误的函数称号以及错误原因。看上面这个函数:
function addClass(element, className){ element.className += " " + className;}
这个函数的功用是向一个给定的element加入新的CSS class(这在JavaScript中非常普遍)。但如果element是null的时候会发作什么?你会失掉一个这样的错误提示“object expected”,很隐晦。然后你需要查看执行堆栈(如果阅读器支持这个功用)来准确定位错误的源头。如果我们抛出一个错误调试就变得简单了:
function addClass(element, className){ if (element != null typeof element.className == "string"){ element.className += " " + className; } else { throw new Error("addClass(): First arg must be a DOM element."); }}