错误

错误类型

执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型,而当错误发生时,就 会抛出相应类型的错误对象。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."); 

要针对函数为什么会执行失败给出更多信息,抛出自定义错误是一种很方便的方式。应该在出现某种特定的已知错误条件,导致函数无法正常执行时抛出错误。换句话说,浏览器会在某种特定的条件下执行函数时抛出错误。