由于 JavaScript 是松散类型的,不会验证函数的参数,因此错误只会发生在代码运行期间。一般来说:
ECMA-262 定义了以下 7 种错误类型,简单说明如下。
其中, error 是基类,其它错误类型都继承自该类型,因此,所有的错误类型都共享了一组相同的属性,错误对象的方法全是默认的对象方法。 Error 类型的错误很少见,如果是浏览器抛出的,这个基类的主要目的是供开发员抛出自定义错误。
在实践中,浏览器不一定在因该抛出错误时就抛出 EvalError 。而且,在实际开发中很少使用 Eval() ,所以遇见这种错误的可能性非常小。
new eval(); // 抛出 EvalError
eval = foo; // 抛出 EvalError
该类型错误是在数值超出相应的范围时抛出, JavaScript 中经常有这种错误。
var item = new Array(-20); // 抛出 RangeError
var item = new Array(Number.MAX_VALUE); // 抛出 RangeError
在找不到对象的情况下,会发生 ReferenceError :
var obj = x; // 在 x 未声明的情况下抛出 ReferenceError
SyntaxError 表示语法错误,当把语法错误的 JavaScript 字符串传入 eval() 函数时,就会导致该类错误。
eval(' a ++ b '); // 抛出 SyntaxError 错误
如果语法错误在 eval() 之外,这不太可能使用 SyntaxError ,因为此时的语法错误会导致 JavaScript 立即停止执行。
TypeError 是 JavaScript 中经常遇见的错误类型。在变量保存着以外的类型时,或者访问不存在的方法时,都会导致此类错误发生。
var o = new 10();
alert('name' in true);
Function.prototype.toString.call('name');
在使用 encodeURL() 或 decodeURL() 时,如果 URL 的格式不正确,就会引起 URLError 错误。这种错误也很少见,因为这两个函数的容错性非常高。
如果想知道错误类型,可以按照如下的方法在 try-catch 语句的 catch 语句中使用 instanceof 操作符:
try {
test();
} catch (error) {
if (error instanceof TypeError) {
/_ 处理类型错误_/;
} else if (error instanceof ReferenceError) {
/_ 处理引用错误_/;
} else {
/_ 处理其他错误_/;
}
}
再跨浏览器的编程中,检查类型错误是确认处理方式的最简方案,包含在 message 属性中的错误消息会因浏览器而不同。