代码执行过程中会发生各种类型的错误。每种类型都会对应一个错误发生时抛出的错误对象。
ECMA-262 定义了以下8 种错误类型:
Error
InternalError
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
Error 是基类型,其他错误类型继承该类型。因此,所有错误类型都共享相同的属性(所有错误对象上的方法都是这个默认类型定义的方法)。浏览器很少会抛出Error 类型的错误,该类型主要用于开
发者抛出自定义错误。
InternalError 类型的错误会在底层JavaScript 引擎抛出异常时由浏览器抛出。例如,递归过多导
致了栈溢出。这个类型并不是代码中通常要处理的错误,如果真发生了这种错误,很可能代码哪里弄错
了或者有危险了。
EvalError 类型的错误会在使用eval()函数发生异常时抛出。ECMA-262 规定,“如果eval 属性
没有被直接调用( 即没有将其名称作为一个Identifier , 也就是CallExpression 中的
MemberExpression),或者如果eval 属性被赋值”,就会抛出该错误。基本上,只要不把eval()当
成函数调用就会报告该错误:
new eval(); // 抛出EvalError
eval = foo; // 抛出EvalError
实践中,浏览器不会总抛出EvalError。Firefox 和IE 在上面第一种情况下抛出TypeError,在
第二种情况下抛出EvalError。为此,再加上代码中不大可能这样使用eval(),因此几乎遇不到这种
错误。
RangeError 错误会在数值越界时抛出。例如,定义数组时如果设置了并不支持的长度,如-20 或
Number.MAX_VALUE,就会报告该错误:
let items1 = new Array(-20); // 抛出RangeError
let items2 = new Array(Number.MAX_VALUE); // 抛出RangeError
RangeError 在JavaScript 中发生得不多。
ReferenceError 会在找不到对象时发生。(这就是著名的"object expected"浏览器错误的原
因。)这种错误经常是由访问不存在的变量而导致的,比如:
let obj = x; // 在x 没有声明时会抛出ReferenceError
SyntaxError 经常在给eval()传入的字符串包含JavaScript 语法错误时发生,比如:
eval(“a ++ b”); // 抛出SyntaxError
在eval()外部,很少会用到SyntaxError。这是因为JavaScript 代码中的语法错误会导致代码无
法执行。
TypeError 在JavaScript 中很常见,主要发生在变量不是预期类型,或者访问不存在的方法时。很
多原因可能导致这种错误,尤其是在使用类型特定的操作而变量类型不对时。下面是几个例子:
let o = new 10; // 抛出TypeError
console.log(“name” in true); // 抛出TypeError
Function.prototype.toString.call(“name”); // 抛出TypeError
在给函数传参数之前没有验证其类型的情况下,类型错误频繁发生。
最后一种错误类型是URIError,只会在使用encodeURI()或decodeURI()但传入了格式错误的
URI 时发生。这个错误恐怕是JavaScript 中难得一见的错误了,因为上面这两个函数非常稳健。
不同的错误类型可用于为异常提供更多信息,以便实现适当的错误处理逻辑。在try/catch 语句
的catch 块中,可以使用instanceof 操作符确定错误的类型,比如:
try {
someFunction();
} catch (error){
if (error instanceof TypeError){
// 处理类型错误
} else if (error instanceof ReferenceError){
// 处理引用错误
} else {
// 处理所有其他类型的错误
}
}
检查错误类型是以跨浏览器方式确定适当操作过程的最简单方法,因为message 属性中包含的错
误消息因浏览器而异。
11-06
583
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
10-16
1048
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
11-06
270
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-05
2165
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)