大家都知道在java中有一套异常处理机制,即用try-catch-finally来捕获异常,用throw来抛出异常。JavaScript也有一套类似java的错误处理机制。

1. try-catch-finally

  ECMA-262 第3 版引入了try-catch 语句,作为JavaScript 中处理异常的一种标准方式。基本的语法如下所示,显而易见,这与Java 中的try-catch 语句是完全相同的。

try {
    //可能会导致错误的代码
} catch(error) {
    //在错误发送时处理错误的代码  
} finally {
    //不论代码是否发送错误都要执行的代码
}

 

  如果try 块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行catch 块。此时,catch 块会接收到一个包含错误信息的对象。不同浏览器error对象中的信息页不同,但也有一个公共的属性: message.

  在JavaScript中finally和java中的finally有一些不同: JavaScript中即使try块或catch块中有return语句,finally中的语句仍会执行,finally会忽略掉try块或finally块中的return语句。

  一般情况下,如果提供finally 子句,则catch 子句就成了可选的(catch 或finally 有一个即可)。

下面再来介绍一下JavaScript中的错误类型。JavaScript中共有7中错误类型: Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError

Error: 所有错误类型的基类。这个基类型的主要目的是供开发人员抛出自定义错误。

EvalError: 在使用eval()函数而发生异常时被抛出。如果没有把eval()当成函数调用,就会抛出错误,例如:

RangeError: 在数值超出相应范围时触发,如数组越界。

ReferenceError: 通常,在访问不存在的变量时,就会发生这种错误.

SyntaxError: 语法错误时抛出的异常。通常是在吧错误语法传入eval函数时触发的。

TypeError: 在变量中保存着意外的类型时,或者在访问不存在的方法时,都会导致这种错误。如"aaa".getTime()

URIError: 在使用encodeURI()或decodeURI(),而URI 格式不正确时,就会导致URIError 错误。

利用不同的错误类型,可以获悉更多有关异常的信息,从而有助于对错误作出恰当的处理。

try {
    someFunction();
} catch (error){
    if (error instanceof TypeError){
      //处理类型错误
    } else if (error instanceof ReferenceError){
        //处理引用错误
    } else {
        //处理其他类型的错误
    }
}        

 

 

2. throw抛出错误

  与try-catch 语句相配的还有一个throw 操作符,用于随时抛出自定义错误。抛出错误时,必须要给throw 操作符指定一个值,这个值是什么类型,没有要求。下列代码都是有效的。

throw 12345;
throw "Hello world!";
throw true;
throw { name: "JavaScript"};

 

  在遇到throw 操作符时,代码会立即停止执行。仅当有try-catch 语句捕获到被抛出的值时,代码才会继续执行。通过使用某种内置错误类型,可以更真实地模拟浏览器错误。每种错误类型的构造函数接收一个参数,即实际的错误消息。下面是一个例子。

function division(x, y) {
    if(y == 0) {
        throw new Error('0不能作为除数');
    }
    return x/y;
}

(function testTry() {
    try {
        division(2, 0)
    } catch(error) {  
        console.log(error.message);   //0不能作为除数
        console.log(error.stack);
    } finally {
        console.log('execute finally');
    }
})()

   另外,利用原型链还可以通过继承Error 来创建自定义错误类型。此时,需要为新创建的错误类型指定name 和message 属性。来看一个例子。

function CustomError(message) {
    this.name = 'CustomError';
    this.message = message;
}
CustomError.prototype = new Error();

 

3. 抛出错误与使用try-catch
  关于何时该抛出错误,而何时该使用try-catch 来捕获它们,是一个老生常谈的问题。一般来说,应用程序架构的较低层次中经常会抛出错误,但这个层次并不会影响当前执行的代码,因而错误通常得不到真正的处理。如果你打算编写一个要在很多应用程序中使用的JavaScript 库,甚至只编写一个可能会在应用程序内部多个地方使用的辅助函数,我都强烈建议你在抛出错误时提供详尽的信息。然后,即可在应用程序中捕获并适当地处理这些错误。
  说到抛出错误与捕获错误,我们认为只应该捕获那些你确切地知道该如何处理的错误。捕获错误的目的在于避免浏览器以默认方式处理它们;而抛出错误的目的在于提供错误发生具体原因的消息。

 

4. onerror事件

  任何没有通过try-catch 处理的错误都会触发window 对象的error 事件。在任何Web 浏览器中,onerror 事件处理程序都不会创建event 对象,但它可以接收三个参数:错误消息、错误所在的URL 和行号。

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

  只要发生错误,无论是不是浏览器生成的,都会触发error 事件,并执行这个事件处理程序。然后,浏览器默认的机制发挥作用,像往常一样显示出错误消息。

 

 

posted on 2014-03-13 21:36  寒岁青松  阅读(125)  评论(0)    收藏  举报