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

Javascript 如何区分不同类型的异常?,javascript,Javascript,我开始学习JavaScript,到目前为止没有问题,但我很难找到JS中异常机制的好解释 它类似于C++,JS允许抛出每个对象,而不是只抛出异常对象(可能是由于它的动态性质)。 工作,以及 throw new Exception('An error occured.'); catch和finally这两种方法的工作方式似乎都与Java等效。不过,我不知道什么是被广泛接受的关于例外的最佳实践 例如,抛出字符串类型的对象是否合法,如: throw 'An error occured'; 如何区分不

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

它类似于C++,JS允许抛出每个对象,而不是只抛出异常对象(可能是由于它的动态性质)。 工作,以及

throw new Exception('An error occured.');
catch
finally
这两种方法的工作方式似乎都与Java等效。不过,我不知道什么是被广泛接受的关于例外的最佳实践

例如,抛出字符串类型的对象是否合法,如:

throw 'An error occured';
如何区分不同类型的异常?

我认为“最佳实践”是抛出与导致异常的问题相关的错误对象的正确类型。ECMAScript定义了几种类型的异常对象,它们都继承自
Error
。这些对象是
EvalError
RangeError
ReferenceError
TypeError
URIError

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

try {
    // do something
}
catch (e) {
    if (e instanceof TypeError) {
        // do something else
    }
}
通常,在不使用异常对象的情况下使用
throw
语句会让我觉得这是一种糟糕的做法,原因包括:

  • 设计用于处理异常的代码可能期望出现错误对象,接收原语可能会导致意外的副作用,或者在不修改处理代码的情况下无法处理异常。这方面的一个例子是在抛出表达式的结果上缺少
    stack
    属性
  • 当未在try/catch语句中使用时,Internet Explorer 8及更低版本将在您尝试抛出时抛出不同的异常,并显示消息“exception Trown and not catch”*。如果您正在使用开发人员工具进行调试,或者将全局异常处理程序设置为
    window.onerror
    ,则这可能会更加混乱
因此,是的,通常坚持正确地抛出实例
Error
或其继承对象


*注意,IE也对不是直接从
Error
构造的错误对象类型执行此操作。是的,我知道这很愚蠢,但他们在IE9中修复了它,尽管他们告诉我这是“设计的”。

如果你正在构建一个AJAX应用程序,异常可能没有那么大用处。由于ajax操作的异步性质,错误处理不会像您预期的那样工作

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

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

抛出和捕获异常非常昂贵,而使用JavaScript,您主要会在尝试解析格式错误的JSON字符串时遇到异常。我建议尽量避免尝试/捕获,而应集中注意旧的方式(返回类型,确保变量在使用之前正确初始化)等错误,因为异常在这里不太可能发生在C++中,或者尤其是java或.net。
对于实际处理它们来说,这是一个很好的方法,但是一般来说,您应该尝试编写具有防御性的JavaScript代码,这样您甚至不需要try/catch。记住,即使是Chrome(JavaScript)中的JavaScript(与Java/C)相比,仍然是缓慢的,更不用说C++了,所以在这些语言中,任何昂贵的东西在java中都可能会更大。

你必须缩小你的问题。什么方面的最佳实践?
throw
是一种反模式,仅仅是因为
catch
中返回的错误没有
.stack
属性,如果它不是真正的
错误
实例,这纯粹是愤怒。顺便说一句,try/catch/throw是JS中的一种通用性能反模式,应该尽可能避免使用。+1,我没有想到要完全反对try/catch语句,尽管我很少需要编写这样的语句。您可能需要try/catch的原因之一是在处理可能不存在或无法实例化的主机对象(如IE的
ActiveXObject
)时。异步代码也会中断
return
,因此这应该是意料之中的。。。
function save_data(){
    try {
        ajax(some_ulr, function(){
            //callback
            do_wrong_thing();
        });
    } catch(e){
        handler_error();
    }
}