当前位置: 首页 > 知识库问答 >
问题:

在Javascript中,即使从未抛出异常,使用try-catch块是否代价高昂?

秦宏盛
2023-03-14

当没有在任何一个try-catch块中抛出异常时,使用几个try-catch块是否“慢”?我的问题和这个问题一样,不过是针对JavaScript的。

假设我有20个函数,其中有try-catch块,另一个函数调用这20个函数中的每一个,其中没有一个抛出异常。我的代码会因为这个try-catch块而执行得更慢或更差吗?

共有1个答案

督阿苏
2023-03-14

你在做典型的CRUD UI代码吗?使用try catches,在代码中使用无缘无故地达到10000的循环,使用Angular/ember--你不会注意到任何性能问题。

如果您正在进行低级别的库、物理模拟、游戏、服务器端等,那么从不抛出try-catch块通常不会有任何关系,但问题是V8直到引擎的版本6才在优化编译器中支持它,因此语法上包含try-catch的整个包含函数将不会被优化。通过创建类似trycatch的帮助函数,您可以轻松地解决此问题:

function tryCatch(fun) {
    try {
        return fun();
    }
    catch(e) {
        tryCatch.errorObj.e = e;
        return tryCatch.errorObj;
    }
}
tryCatch.errorObj = {e: null};


var result = tryCatch(someFunctionThatCouldThrow);
if(result === tryCatch.errorObj) {
    //The function threw
    var e = result.e;
}
else {
    //result is the returned value
}

在V8版本6之后(随Node8.3和最新的Chrome一起提供),try-catch中的代码的性能与普通代码的性能相同。

 类似资料:
  • 我们知道捕获异常的代价很高。但是,即使从未抛出异常,在Java中使用try-catch块是否也会很昂贵呢? 我发现堆栈溢出问题/答案为什么try块很贵?,但它是针对.NET的。

  • 问题内容: 我们知道捕获异常非常昂贵。但是,即使从不抛出异常,在Java中使用try-catch块是否也很昂贵? 问题答案: 几乎没有任何花销。代码的元数据不是在运行时进行设置,而是在编译时进行结构化,这样,当引发异常时,它现在执行相对昂贵的操作,即遍历堆栈并查看是否存在任何可捕获此异常的块。例外。从外行的角度来看,它可能也是自由的。它实际上是在抛出导致你付出代价的异常-但是,除非你抛出数百或数千

  • 当我在node中创建一个异步函数并使用await时,我正在使执行等待一个承诺解析(可以是一个解析或一个拒绝),我所做的是在try/catch块中放入一个await承诺,并在承诺拒绝的情况下抛出一个错误。问题是,当我在try/catch块内调用这个异步函数来捕获错误时,我会得到一个UnhandledPromiserEjectionWarning。但是使用await的全部意义并不是等待承诺解决并返回它

  • 我有一个实现以下接口的基类,上面声明的方法抛出基本异常类型。 有许多具体的类扩展了基类,我不想在所有这些类中添加块。有没有一种方法可以处理而不添加? 接口 基层 混凝土类示例(共30个)

  • 我有一个try/catch块,我已将其写入JetBrains网络StormIDE,它会给我一个错误。错误如下:“本地捕获的异常的‘抛出’/此检查报告任何JavaScript抛出语句的实例,其异常总是通过包含try语句来捕获。使用抛出语句作为“goto”来更改本地控制流可能会令人困惑。” 如果我将活动从捕获块放入尝试块的 if 块中,那么我将不需要尝试/捕获/最终。那么,除了条件语句(if)之外,你

  • 问题内容: 在一个教程中,我发现 您的代码无法处理Unchecked Exception, 即我们不能使用块,示例是类似的异常,但是可以使用try / catch块处理这些异常。我认为我不清楚这个概念! 我也认为throw关键字只能与block.can一起使用吗? 问题答案: 已检查和未检查的异常之间的唯一区别是,必须使用捕获或在方法签名中声明 已 检查的异常,而对于未检查的异常,这是可选的。 您