【问题标题】:Can I use a try/catch in JavaScript without specifying the catch argument/identifier?我可以在 JavaScript 中使用 try/catch 而不指定 catch 参数/标识符吗?
【发布时间】:2014-03-04 16:05:33
【问题描述】:

我想知道在执行 JS try/catch 时是否有办法不指定参数。不过,每次我尝试这个时,try/catch 都不起作用。

工作版本:

try{
  //Breaking code
} catch(e){
  //Nothing happens here
}

我的想法(没有'e'):

try{
  //Breaking code
} catch(){
  //Nothing happens here
}

【问题讨论】:

  • 你想达到什么目的?
  • 你为什么要那个?如果您不处理异常,则将 catch 正文块留空。
  • 自 2019 年起,(e) 是可选的。 stackoverflow.com/a/56001361/6269864

标签: javascript try-catch


【解决方案1】:

这是一个过时的答案。它不再适用于当前版本的 JavaScript。有关详细信息,请参阅其他答案。


你就是做不到。 The spec 表示catch 之后的括号内必须始终有一个标识符。

【讨论】:

  • 需要注意的是,从 Firefox 58 和至少一些最近的 Chrome 版本开始,您可以写 try {...} catch {...}(即省略括号和标识符)。但是,我建议不要这样做,因为它可能导致一些难以发现的解析错误(适用于 Chrome 和 Firefox 的一个版本,但不适用于另一个版本)。见documentation
【解决方案2】:

2019 年可选的 catch 绑定

Node.js

在 Node.js 中,此功能称为 Optional Catch Binding,从 Node.js 版本 10.3 开始支持,请参阅 https://node.green

打字稿

在 Typescript 中,从 2.5 版开始允许这样做。

浏览器支持

  • 铬:从 68 年开始
  • Firefox:从 ​​58 年开始
  • Edge、IE、Safari:暂时不支持

标准

该提案目前处于第 4 阶段,这意味着它的实施已经完成,并且保证会包含在下一版本的 ECMAScript 标准中。

因此,如果您使用 Node.js 或使用 Babel 转译您的浏览器代码,那么根据标准,这是一个完全合法的语法:

try {

} catch {
  // No need for the `(error)` after `catch`!
}

【讨论】:

  • 一个重要的注意事项是,在 Typescript 中,如果您以 esnext 为目标,则此语法将被 emitted,破坏不支持它的 Edge 等浏览器。 (我相信实际上有一个合并的 PR 可以将这个功能添加到 Edge,但它是去年的,仍然没有登陆。我现在在我的历史中找不到我读过这个的页面......)
【解决方案3】:

只需省略括号,如下所示:

try {
    // Code...
} catch {
    // Code...
}

【讨论】:

  • 不,这是错误的,在 Internet Explorer 中不起作用。请阅读接受的答案。
  • @JennyO'Reilly 这没有错,它是 ECMAScript 2019 规范的一部分:tc39.github.io/ecma262/#prod-Catch 如果你需要支持 IE,那么使用 Babel。很多东西在IE里不行,都是IE的错。
  • 在 Node (8.11) 中也不起作用。在 10.10 中工作,但前者被标记为“推荐给大多数用户”,因此不能忽略。
  • @riv 节点 10 将在 2018 年 10 月成为推荐,距离不到 2 个月,我不认为这是一个大问题。除了 Edge 之外的所有主流浏览器现在都支持这个,Edge 正在开发它:github.com/Microsoft/ChakraCore/pull/5310
  • @Coderer 不幸的是,微软已经放弃了旧版 Edge。新的 Edge 支持这种语法。
【解决方案4】:

同意,这是强制性的,以便您可以完全处理错误 - 即使您知道错误可能是什么。事实上,只需在变量名中使用 prod,不要在 catch 例程中使用它:)

【讨论】:

    【解决方案5】:

    specification gives the grammar for a catch block

    赶上

      catch ( 标识符 )

    接着说:

    当 catch 子句捕获异常时,它的 Identifier 将绑定到该异常

    因此,从 catch 块中省略标识符是语法错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-25
      • 2013-02-08
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2014-12-01
      • 1970-01-01
      相关资源
      最近更新 更多