【问题标题】:Should async/await code be entirely contained with try block?async/await 代码是否应该完全包含在 try 块中?
【发布时间】:2017-11-12 09:36:25
【问题描述】:

我一直在阅读新的 async/await 并一直在 Node 8 中使用它。我遇到一些人将所有内容都放在最初的 try 块中,而其他人只有 @987654322 @ 其余的都在 try/catch 之下。这个比那个好吗?这是我自己代码中的函数之一,以两种样式显示我的意思:

async function findCurrentInstallations() {
    try {
        const results = await installations.find({});

        if (results.length === 0) { throw new Error('No installations registered'); }
        return results;
    } catch (err) {
        throw err;
    }
}

--

async function findCurrentInstallations() {
    let results;

    try {
        results = await installations.find({});
    } catch (err) {
        throw err;
    }

    if (results.length === 0) { throw new Error('No installations registered'); }
    return results;
}

【问题讨论】:

  • 为什么你会捕获一个错误只是为了立即再次抛出它?你甚至没有记录错误。这两个try ... catch 块完全没有意义。
  • @Thomas 因为我还在学习这个并且还不能 100% 确定我在做什么?一个回应基本上是说“你这个白痴,你到底为什么这样做?”没有帮助。
  • 不,我的意思是“这些 try...catch 块毫无意义。根本没有理由这样做。它们不会为您的代码增加任何价值,甚至连记录错误都没有在重新扔之前”。我既没有说,也没有说“你这个白痴”;抱歉,如果遇到这样的情况。不是“你为什么要那样做?”一个有效的问题了吗?也许更多的是一个需要思考的问题,一个重新思考你的动作/代码的提示,而不是一个期望得到实际答案的问题。
  • 别担心,这该死的纯文本媒体让语气难以确定!感谢您的澄清。 :)
  • async/await 是 ES2017 的一部分,不是 ES7!

标签: javascript async-await ecmascript-2017


【解决方案1】:

在您提供的示例中根本不需要trycatch,这是async 函数的默认行为。

您的两个代码片段不同之处在于第一种情况下的throw new Error(... 将由catch 子句处理。但由于 catch 子句在所有实际用途中都是无操作的、传递的,所以这并不重要。

我会这样写:

async function findCurrentInstallations() {
    const results = await installations.find({});
    if (results.length === 0) { throw new Error('No installations registered'); }
    return results;
}

【讨论】:

  • 有趣,谢谢!我已经看到很多确实使用 try/catch 的例子(这就是我认为有必要的原因)......那么你会在什么情况下需要它们?
  • 展示实际效果 - jsfiddle.net/y0Lxynh9(稍作修改以显示要点)
  • 什么情况当你想对错误做一些特定的事情时,比如自己处理它,然后决定是否重新抛出,而不是让它像往常一样变成对异步函数返回的承诺的拒绝。
  • 啊啊啊!好吧,这更有意义。非常感谢。 :)
  • 我相信这种代码行为是错误的。您不知道 installations.find 抛出的原因。该 js 代码甚至可以关闭应用程序,因为结果可能是未定义的并且访问其上的长度属性会引发巨大错误。
【解决方案2】:

仅包装await,只会捕获由等待失败引发的错误,如果代码中的任何行失败,包装整个事物都会失败,这取决于您要捕获的内容。

请注意,您只是在示例中抛出,这是无用的,因为应用程序在失败时无论如何都会抛出。

【讨论】:

    猜你喜欢
    • 2018-09-14
    • 2019-07-03
    • 2021-08-28
    • 2018-06-21
    • 2020-06-05
    • 2021-11-16
    • 2012-11-06
    • 2017-06-16
    • 1970-01-01
    相关资源
    最近更新 更多