【问题标题】:Why does try catch not catch await function errors为什么try catch不catch await函数错误
【发布时间】:2020-07-02 16:56:59
【问题描述】:

我知道如果我们有这样的 try catch 设置:

try{
   runSyncFunction()
}
catch(err){
  cosole.log(err)
}

如果runSyncFunction 中有错误,将触发 catch 错误。

根据我的理解,如果我们尝试像这样捕获设置:

try{
   runAsyncFunction()
}
catch(err){
  cosole.log(err)
}

如果runAsyncFunction 中有错误,则不会触发 catch 错误,因为该函数稍后会运行。

我不明白为什么我们使用 await 时不会触发 catch 错误:

try{
   await runAsyncFunction()
}
catch(err){
  cosole.log(err)
}

如果这次异步函数有错误,并且由于javascript引擎正在等待它完成运行,为什么它无法在错误的情况下捕获错误。

编辑1:

router.post("/postDetails", async(req, res) => {
  try{
     let partID = await database.getPartID(partNumber[i])
     if (!partID) {
            throw createError(404, `"${partNumber[i]}" PartNumber not 
      found. Please re-enter the partnumber`)
    }
    //Other stuff  
  }
  catch(err){
    console.log(err) 
  }
})

第二个功能:

database.getPartID = async function getPartID(partNumber){
    try{
        let partID = await pool.query(`Select partID from parts where partNumber = '${partNumber}'`)
        return partID[0].partID
    }
    catch(err){
        console.log(err)
        return false
    }
}

我返回 false 是因为如果有 try catch 块时第二个异步函数中出现错误,第一个异步函数不会抛出错误消息

【问题讨论】:

  • 我相信在这种情况下应该会发现错误......你确定你正确使用了异步等待吗?
  • 我同意 - 你能证明你的观点吗?如果等待的 Promise 抛出错误,则应该捕获错误。如果它自己捕获了错误并且没有抛出,所以它解决了,你不会看到 catch 块被调用
  • 您介意与我们分享该功能的实现吗?
  • 我在第二个异步函数中尝试了捕获块。这就是第一次捕获不会触发的原因吗?
  • 提供第二个异步函数。

标签: javascript node.js


【解决方案1】:

这些是使用try...catch的一些技巧

我们可以使用try...catch 进行同步代码。

我们可以使用try...catch(结合async函数)和.catch()方法来处理异步代码的错误。

在 try 块中返回 promise 时,如果您希望 try...catch 块捕获错误,请确保 await 它。

【讨论】:

    猜你喜欢
    • 2023-01-17
    • 1970-01-01
    • 2022-01-21
    • 2019-04-06
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 2019-03-14
    相关资源
    最近更新 更多