【问题标题】:Proper usage of try/catch block in JavaScript在 JavaScript 中正确使用 try/catch 块
【发布时间】:2014-09-08 21:17:23
【问题描述】:

我有一个写入 JetBrains Webstorm IDE 的 try/catch 块,它给了我一个错误。错误内容如下:“本地捕获的异常的'throw'/此检查报告 JavaScript throw 语句的任何实例,其异常总是通过包含 try 语句来捕获。使用 throw 语句作为 'goto' 来更改本地控制流可能会令人困惑。”

try {
    var invoice = parseInt(localStorage[0]);
    if (isNaN(invoice)) {
        console.warn("invoice NaN; let's fix that...");
        throw "executing catch";
    }
}
catch (e) {
    console.log(e);
    this.test();
    invoice = 1;
}
finally {
    localStorage[invoice] = JSON.stringify(Ticket);
    console.log("localStorage[" + invoice + '] : ' + localStorage[invoice]);
    localStorage[0] = parseInt(localStorage[0]) + 1;
}

如果我将 catch 块中的活动放入 try 块的 if 块中,那么我将不需要 try/catch/finally。那么除了使用条件语句 (if) 之外,您还能如何抛出错误,以及如何避免将 throw 用作“goto”?

谢谢!

【问题讨论】:

  • try/catch通常用于try块中有函数调用,该函数可能会抛出异常。
  • 就个人而言,这种方法并不困扰我。有时这种结构最有意义,我一点也不觉得它令人困惑。如果您可能需要从 try 块内的多个不同点进行投掷,这将特别有用。如果你只需要从一个抛出,那么catch 块可能有点多余,除非你期望其他一些函数调用也会抛出。
  • 您通常不会手动致电throwtry/catch 通常在您调用的函数可能“抛出”错误并且您想“捕获”它时使用。
  • 如果您同意@cdhowie,您可以在首选项中禁用此警告。这是Inspections -> Javascript -> Error Handling -> Exception used for local control-flow
  • 为什么会报错?为什么你认为将 catch 代码放在 if 块中是可取的?即使没有 throw 和 catch,try/finally 仍然可以发挥作用。

标签: javascript


【解决方案1】:

这功能相同,而且更干净。为什么要扔/接?

try {
    var invoice = parseInt(localStorage[0]);
    if(isNaN(invoice)){
        console.warn("invoice NaN; let's fix that...");
        console.log("executing catch");   // not really needed
        this.test();
        invoice = 1;
    }
} finally {
    localStorage[invoice] = JSON.stringify(Ticket);
    console.log("localStorage[" + invoice + '] : ' + localStorage[invoice]);
    localStorage[0] = parseInt(localStorage[0]) + 1;
}

【讨论】:

  • 另一方面,你可能根本不需要 try/finally,除非 this.test() 抛出错误。
  • 请注意,在更复杂的场景中,您可能有多个throw 语句;使用 try/catch 块允许您集中错误处理代码。如果你只有一个throw(并且没有你调用的函数可以抛出),那么以这种方式使用 try/catch 确实没有什么意义。
  • 你能有一个没有catchtry 吗?
  • @RocketHazmat 您必须至少拥有catchfinally 之一。如果您只有一个finally 块并且发生错误,则finally 块将运行,然后错误将向上传播到调用堆栈。此构造允许您在发生错误后进行清理,但不能捕获错误。
  • 好的,所以我放弃了这种情况下的 try/catch ;-p 我感谢所有关于这个问题的想法。我现在更完全地理解了 try/catch/finally。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2015-01-07
  • 2019-12-04
  • 2016-12-10
相关资源
最近更新 更多