我如何区分不同类型的异常?

时间:2012-01-24 12:40:37

标签: javascript

我开始学习JavaScript,到目前为止没问题,但我很难找到JS中的异常机制的一个很好的解释。

它似乎与C ++类似,JS允许抛出每个对象,而不是仅抛出一个Exception对象(可能是由于它的动态特性)。

throw 'An error occured.';

工作,以及

throw new Exception('An error occured.');

catchfinally似乎都像Java一样工作。不过,我不知道有哪些被广泛接受的关于例外的最佳做法。

因此,例如,抛出string类型的对象是合法的,例如:

throw 'An error occured';

我如何区分不同类型的例外?

3 个答案:

答案 0 :(得分:15)

我认为,“最佳实践”是抛出与导致异常的问题相关的正确类型的Error对象。 ECMAScript定义了几种类型的异常对象,所有异常对象都继承自Error。这些对象为EvalErrorRangeErrorReferenceErrorTypeErrorURIError

这些构造函数由本机ECMAScript函数使用,这使您可以执行以下操作:

try {
    // do something
}
catch (e) {
    if (e instanceof TypeError) {
        // do something else
    }
}

一般来说,在不使用异常对象的情况下使用throw语句会让我感到很糟糕,原因如下:

  • 用于处理异常的代码可能需要Error对象,接收原语可能会导致意外的副作用或无法处理异常而无需修改处理代码。一个例子是throw表达式的结果缺少stack属性。
  • 当未在try / catch语句中使用时,Internet Explorers 8及更低版本将在您尝试抛出时抛出另一个异常,并显示消息“异常抛出且未捕获” * 。如果您使用开发人员工具进行调试或将全局异常处理程序设置为window.onerror,这可能会更加令人困惑。

所以,是的,通常坚持正确地抛出实例Error或其继承对象。

* nb,IE也针对不是直接从Error构造的Error对象类型执行此操作。是的,我知道这很愚蠢,但他们在IE 9中修复了它,即使他们告诉我这是“按设计”。

答案 1 :(得分:12)

抛出和捕获异常是非常昂贵的,并且使用JavaScript时,在尝试解析格式错误的JSON字符串时,您将主要获得异常。我建议尽量避免try / catch,而是专注于以旧方式检查错误(返回类型,确保变量在使用之前正确初始化等等),因为异常在这里不太可能发生在C ++中或者特别是Java或.NET。

Andy E's recommendation对于实际处理它们是一个很好的,但一般来说,你应该尝试防御性地编写JavaScript代码,这样你甚至不需要try / catch。请记住,即使是与Java或C#相比,Chrome中的JITed JavaScript(速度最快的引擎)仍然很慢,更不用说C ++,因此在JavaScript中,这些语言中的任何代价都可能更高。

答案 2 :(得分:2)

如果您正在构建一个AJAX应用程序 - 异常可能不那么有用。由于ajax操作的异步性质,错误处理将无法正常工作

function save_data(){
    try {
        ajax(some_ulr, function(){
            //callback
            do_wrong_thing();
        });
    } catch(e){
        handler_error();
    }
}

在上面的代码片段中,do_wrong_thing引起的错误不会触发catch部分。