为什么不是';t Try/Catch在JavaScript中使用得更频繁?

为什么不是';t Try/Catch在JavaScript中使用得更频繁?,javascript,Javascript,似乎对于其他支持Try/Catch的语言,开发人员对该功能的利用比在JavaScript中更多。这有什么原因吗?Try/Catch的JS实现有缺陷吗?我认为Try/Catch与if语句相比有更多的开销,尽管我认为只有在实际抛出异常时才有意义。我经常使用try/catch,但前提是我知道很有可能抛出异常 如果有效地使用,就没有理由不使用try/catch。不,它没有缺陷,但对于同步代码来说,使用自己的代码检查东西通常比使用笨重的try{}catch(e){}更容易、更干净 例如: var cont

似乎对于其他支持Try/Catch的语言,开发人员对该功能的利用比在JavaScript中更多。这有什么原因吗?Try/Catch的JS实现有缺陷吗?

我认为Try/Catch与if语句相比有更多的开销,尽管我认为只有在实际抛出异常时才有意义。我经常使用try/catch,但前提是我知道很有可能抛出异常


如果有效地使用,就没有理由不使用try/catch。

不,它没有缺陷,但对于同步代码来说,使用自己的代码检查东西通常比使用笨重的
try{}catch(e){}
更容易、更干净

例如:

var container = document.getElementById("timmy");
container.innerHTML = "I'm timmy!";
sqlConnection.query("SELECT * FROM table", 
    function(){console.log("queried!");});
如果没有ID为“timmy”的元素,我们可以这样处理:

try
{
    container.innerHTML = "I'm timmy";
}
catch (error)
{
    //handle no container
}
或:


要记住的另一件事是JavaScript应用程序是事件驱动的,程序主要部分的try/catch块无法捕获事件回调中发生的错误

例如:

var container = document.getElementById("timmy");
container.innerHTML = "I'm timmy!";
sqlConnection.query("SELECT * FROM table", 
    function(){console.log("queried!");});
这将触发一些在程序继续运行时运行的本机代码。如果发生错误,您不能期望您的程序回溯到此行,这样您的错误处理程序就可以完成它的工作了!相反,您处理回拨本身中的错误。通常的做法是,通过将回调作为第一个参数传递,为回调提供发生的任何错误

sqlConnection.query("SELECT * FROM table", 
    function(error, data){
        if(error) console.log("query failed");
        else console.log("queried!");
    });
或者,如果您的代码在回调中失败,您可以按照我上面提到的方式处理它

link.onclick = function(e)
{
    var popUp = document.getElementById("popup");
    if(!popUp)
        return true; //follow link if no pop-up exists
    popUp.style.display = "block";
};

JavaScript不太需要它们,原因是,几乎没有任何理由捕捉错误,因为一个错误不会停止整个脚本。 Javascript是事件驱动的,大多数函数在特定事件发生时运行,并且是客户端的,因此如果出现任何错误,它就会出错,捕获和处理错误几乎没有任何好处。
只有我的观点。

试着看看这篇文章:

从以上链接:

try-catch-finally构造相当独特。与其他构造不同,它在运行时在当前作用域中创建一个新变量。每次执行catch子句时都会发生这种情况,其中捕获的异常对象被分配给变量。此变量不存在于脚本的其他部分中,即使在同一范围内也是如此。它在catch子句的开头创建,然后在结尾销毁

由于此变量是在运行时创建和销毁的,并且代表语言中的一种特殊情况,某些浏览器处理它的效率不高在捕获异常时,将捕获处理程序放置在性能关键循环中可能会导致性能问题

您也可以查看类似的问题

更新

添加到的链接:因为它包含有关V8以及如何处理这些(和类似)构造的有用信息

特别是:

当前不可优化:

  • 生成函数
  • 包含for of语句的函数
  • 包含try-catch语句的函数
  • 包含try finally语句的函数
  • 包含复合let赋值的函数
  • 包含复合常量赋值的函数
  • 包含包含proto或get的对象文本的函数 或设置声明
可能永远无法优化:

  • 包含调试器语句的函数
  • 按字面意思调用eval()的函数
  • 包含with语句的函数

大多数javascript代码的异步特性将try/catch隐藏在较低级别,然后调用错误回调

js中大多数繁重的代码都是异步的,并且使用回调或承诺模式。另一个代码很简单,不需要try/catch


如果你深入研究js库(选择你最喜欢的),你会发现try/catch块包含了在现代js应用程序中执行的大量应用程序代码。然后,这些库调用您在许多js代码示例中看到的错误或失败回调。

我猜人们不知道或不知道如何使用它。或者,有时通过简单的检查,你可以避免使用
try
,如果你能在失败之前检测到它会失败的话。它们确实会失败,但是javascript没有它们会更好。我的意思是,它不是一些需要检查错误的高级编码,你在操作DOM,捕捉事件,如果出现任何错误,它就会停止,即使捕捉到异常也会stop@I-热爱php——记住javascript也可以用在其他方面(参见node.js),我真的认为这是主要原因。大多数需要try/catch处理的错误都隐藏在各种库的碗中。在尝试操作之前,可以很容易地检查其他潜在的错误情况。如果通过一些测试,您可以确保异常不会发生,那么就不需要try-catch。Javascript中只有少数几种情况需要测试/探测错误。更糟糕的是(从性能角度来看),至少V8不会用try-catch优化函数。因此,即使整个循环发生在try块内,它也会变慢。我在一次测试中提高了10-15%的性能,只需将一个性能关键循环移动到它自己的函数中,并将try-catch保持在它之外。那么,try-finally块没有任何catch会有性能损失吗?@Nathan看这里:看来try-catch和try-finally在V8中都不可优化。“优化编译器完全不支持某些构造,使用此类语法将使包含的函数无法优化。请务必注意,即使构造无法访问或无法运行,这些构造仍会导致函数无法优化。”更新:根据,除第一个和最后一个“当前不可优化”结构现在是optimiz