1

我对 JavaScript 还是比较陌生,来自更经典的(即 Java,也是 ActionScript 3.0)背景。我发现库/框架的 API 的错误实现通常会在调用堆栈中进一步破坏事情,而没有明确表明它是应用程序代码(而不是库代码)破坏了事情。

例如,一个 jQuery.trigger() 调用可能会调用一个抛出错误的处理程序,并且该调用不包含在 try-catch 中(也不实现任何其他类型的错误保护),并阻止所有其他处理程序触发。

我知道错误应该停止执行,但似乎库代码可以更好地从应用程序代码中沙箱化,而且我在 JS 库中看到这种破坏比在我使用过的其他语言中更频繁。

4

2 回答 2

4

首先,因为捕获单个异常很痛苦:

try {
    doSomething();
} catch(e) {
    if (e instanceof SomeException) {
        // handle SomeException
    } else {
        throw e; // and lose stacktrace information :-(
    }
}

捕获所有异常通常是错误的。

其次,因为 JavaScript 本身的异常层次结构在区分不同类型的错误和提供有关它们的信息属性方面非常差。JavaScript 更喜欢做一些你可能想要做的事情,然后悄悄地中断,而不是引发错误(参见undefinedet al)。历史上浏览器之间也不一致(尤其是 DOM 异常)。这意味着没有使用异常的文化并且继承到库设计中。

于 2013-07-31T22:08:41.557 回答
1

bobince 所说的,即使try-catch在你的函数中提到,目前也意味着该函数中的任何内容都不会被优化。请参阅此处,请注意 JSPerf 并不意味着显示幅度,优化和未优化代码之间的差异可能高达 1000 倍(或其他)。您可以在测试中添加更多代码,您应该会看到相对差异越来越大。

请参阅V8 源代码SpiderMonkey 错误

这与 Java 完全不同,Java 中仅提及 try-catch 并不会真正影响性能,而是在实际发生异常时付费(然后没关系)

于 2013-07-31T22:33:56.543 回答