在用户视图之外处理脚本错误(异常),避免浏览器向用户报告错误信息,以防止影响用户体验
下面先介绍一种最简单的向后兼容方式:将下面的代码置于页面的<head></head>节内:
这样不会阻止编译期的脚本错误(例如页面加载时解释器发现的语法错误),也不会向你透露代码的何处潜伏着错误。所以只有你的代码经过了充分的测试后才使用这种方法,在测试的时候,要把这些代码去掉。
在IE5和Netscape6及它们的后续版本中,你可以使用更多的错误(异常)处理方式。为防止早期的浏览器执行这些特殊的脚本时失败,将这些语句所在 的<script>标签的language属性设置为JavaScript1.5(language="JavaScript1.5")。
将可能导致或抛出异常的语句封装在一个try...catch...finally结构中。先执行try块中的语句,其中包含可能发生异常的代码,如果发生异常,则执行catch块中的代码,而不管是否发生异常,最后会无条件执行finally块的语句:
每个被抛出的异常都会产生一个Error对象的实例,该对象的引用可以作为catch子句的参数,如上面代码的ex参数,catch子句中的语句可以查看 该对象的属性以获得更多信息。到目前为止,在ECMAScript标准中只有两个属性得到正式认可,即message和name。一些浏览器则实现了更多 的属性:
| 属性 |
IE的支持 | NN的支持 | 描述 |
| description |
5 |
n/a |
异常的描述信息 |
| fileName | n/a |
6 | 抛出异常的脚本所在文件的URI |
| lineNumber |
n/a |
6 |
抛出异常的代码的行号 |
| message |
5.5 |
6 |
异常的描述信息(ECMA) |
| name |
5.5 |
6 |
异常类型(ECMA) |
| number |
5 |
n/a |
IE独有的异常代号 |
比如,我们可以写这样一段代码:
要访问colors索引为2的元素,会引发一个异常:colors is not defined。catch块中的语句会告诉用户一些简单的信息。这看起来不错,可以用这种方法给用户显示一些比较友好的信息。
等等,还要注意,这里的catch语句会捕捉 所有类型的异常。想想在C#中,我们需要尽量避免捕获通用的Exception类型的异常,因为它太通用了,我们有时还希望能针对不同类型的异常采取不同 的应对方法。这里也是一样,幸运的是,JavaScript中也有一些特定类型的异常。比如,对于上面代码引发的异常,我们可以这么写:
在捕获异常后,会进行异常类型的判断,只处理TypeError类型的异常,其他类型的则忽略。
JavaScript中共有六种基本的异常类型:
下面的代码演示了嵌套的异常处理的流程:
这里使用throw语句抛出一个异常,throw语句可以抛出任意对象。
输出结果为:
Outer try running..
Nested try running...
Nested catch caught an error
Nested finally is running...
Outer catch caught an error re-thrown
Outer finally running
异常的信息不要让用户看到。使用message属性来决定如何处理异常。
也可以在脚本中有意识地抛出异常建立自己的异常处理机制。看下面的示例:
在try块中检测表单域的值,如果不合要求,则抛出自定义异常,catch块会捕获该异常,在这里进行相应的处理。