1. try-catch

ECMA-262第3版引入了try-catch语句,基本的语法如下所示:

try {
}
catch(error) {
}

如果try块中的任何代码发生错误,就会立即执行catch块。此时,catch块会接收到一个包含错误信息的对象。即使不使用这个错误对象,也要起个名字,对象中包含的实际信息因浏览器而异,但共同的是一个保存错误消息的message属性,ECMA-262还规定了一个保存错误类型的name属性,所有浏览器都支持这个属性(Opera 9之前的版本除外)。


2. finally

虽然在try-catch块中是可选的,但finally子句一经用,无论如何都会执行,甚至return语句都不会阻止,例如:

function test() {
  try {
    return 1;
  }
  catch(error) {
    return 2;
  }
  finally {
    return 3;
  }
}


3. 错误类型

每种错误都有对应的错误类型,而当错误发生时,就会抛出相应类型的错误对象,ECMA-262定义了7种错误类型:

1) Error: 基类型。

2) EvalError: 使用eval()函数发生异常时抛出。

3) RangeError: 数值超出相应范围时抛出。

4) ReferenceError: 找不到对象时抛出。

5) SyntaxError: 使用eval()函数中的字符串有语法错误时抛出。

6) TypeError: 在变量中保存意外类型或访问不存在的方法时抛出。

7) URIError: 使用encodeURI或decodeURI()中URI格式不正确时抛出。


4. 抛出错误

与try-catch相配的还有一个throw操作符,用于抛出自定义错误。抛出错误时,必须给throw操作符指定一个值,这个值的类型没有要求,例如:

throw 123;
throw "Hello World!";

在遇到throw操作符时,代码会立即停止执行。


5. 错误事件

没有通过try-catch处理的错误都会触发window对象的error事件。任何浏览器中,onerror事件处理程序都不会创建event对象,但它可以接受3个参数:错误消息、错误所在的URL和行号。只要发生错误,无论是不是浏览器生成的,都会触发error事件,并执行这个事件处理程序,如果在事件处理程序中返回false,可以阻止浏览器报告错误的默认行为,例如:

window.onerror = function(message, url, line) {
  alert(message);
  return false;
}

图像也支持error事件,只要图像的src属性中的URL不能返回可以被识别的图像格式,就会触发error事件。