【问题标题】:JS Multiple Nested Try...Catch BlocksJS 多重嵌套 Try...Catch 块
【发布时间】:2022-01-01 12:03:00
【问题描述】:

我有一个函数需要以严格的顺序执行多个承诺,如果任何一个失败,整个函数都需要出错。我知道我应该使用 Try...Catch 块来捕获任何抛出的异常。

目前,我正在使用嵌套的 try...catch,例如:

try {
  try {
    code1()
  } catch(err) {
    console.log("Inner 1 ", err)
    throw err
  }

  try {
    code2()
  } catch(err) {
    console.log("Inner 2 ", err)
    throw err
  }
} catch(err) {
  console.log("Outer", err)
} finally {
  console.log("Full Success")
}

这里的意图是如果code1()code2() 失败,外部catch 将触发。如果code1code2 都成功,则外部finally 块将触发。

但是,现在看来,无论code1code2 是否成功,除了相关的内部catch 语句之外,外部finally 总是被触发。

有没有办法让外部catch触发?

【问题讨论】:

  • finally 无论内部发生什么都会执行。
  • @Barmar 哎呀……我对文档的阅读让我相信它只有在成功时才能执行……
  • 来自MDN:在try语句完成后执行的语句。无论是否抛出或捕获异常,这些语句都会执行。
  • @Barmer 是的,重新阅读后意识到我的错误。我停在第一句话...
  • Python 在它的else: 块中有你想要的。

标签: javascript exception try-catch


【解决方案1】:

事实证明,感谢@Barmar 的评论,finally 块将始终执行,这就是为什么我的代码总是抛出 finally。相反,我将“完全成功”移到外部 try 块中。

try {
  try {
    code1()
  } catch(err) {
    console.log("Inner 1 ", err)
    throw err
  }

  try {
    code2()
  } catch(err) {
    console.log("Inner 2 ", err)
    throw err
  }

  console.log("Full Success")
} catch(err) {
  console.log("Outer", err)
}

现在,它似乎正在按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多