错误
错误类型
执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型,而当错误发生时,就 会抛出相应类型的错误对象。ECMA-262 定义了下列 7 种错误类型:
- Error
Error 是基类型,其他错误类型都继承自该类型。因此,所有错误类型共享了一组相同的属 性(错误对象中的方法全是默认的对象方法)。这个基类型的主要目的是供开发人员抛出自定义错误。
- EvalError
EvalError 类型的错误会在使用 eval()函数而发生异常时被抛出。简单地说,如果没有把 eval()当成函数调用,就会抛出错误,例如:
new eval(); //抛出 EvalError
eval = foo; //抛出 EvalError
- RangeError
RangeError 类型的错误会在数值超出相应范围时触发。例如,在定义数组时,如果指定了数组不 支持的项数(如20 或 Number.MAX_VALUE),就会触发这种错误。
var items1 = new Array(-20); //抛出 RangeError
var items2 = new Array(Number.MAX_VALUE); //抛出 RangeError
- ReferenceError
在找不到对象的情况下,会发生 ReferenceError。通常,在访问不存在的变量时,就会发生这种错误,例如:
var obj = x; //在 x 并未声明的情况下抛出 ReferenceError
- SyntaxError
语法错误
var 1a; // 变量名错误
console.log 'hello'); // 缺少括号
- TypeError
在变量中保存着意外的类型时,或者在访问不存在的方法时,都会导致这种错误。
var tmp = 123;
tmp(); // TypeError: a is not a function
- URIError 在使用 encodeURI()或 decodeURI(),而 URI 格式不正确时,就会导致 URIError 错误。这种 错误也很少见,因为前面说的这两个函数的容错性非常高。
decodeURI('%1') // Uncaught URIError: URI malformed(…)
捕捉错误 try catch
把所有可能会抛出错误的代码都放在 try 语句块中,而把那些用于错误处理的 代码放在 catch 块中。例如:
try {
window.someNonexistentFunction();
} catch (error){
alert("An error happened!");
}
抛出错误 throw
在遇到 throw 操作符时,代码会立即停止执行。仅当有 try-catch 语句捕获到被抛出的值时,代 码才会继续执行。通过使用某种内置错误类型,可以更真实地模拟浏览器错误。每种错误类型的构造函数接收一个参 数,即实际的错误消息。下面是一个例子。
throw new Error("Something bad happened.");
要针对函数为什么会执行失败给出更多信息,抛出自定义错误是一种很方便的方式。应该在出现某种特定的已知错误条件,导致函数无法正常执行时抛出错误。换句话说,浏览器会在某种特定的条件下执行函数时抛出错误。