【问题标题】:Try/catch block and unhandled promise exceptionTry/catch 块和未处理的承诺异常
【发布时间】:2018-12-13 00:31:35
【问题描述】:

我想测试我的异步函数查询一个不存在的表。因此错误是故意产生的。

async function getPosts() {
  try {
    const connection = await dbConnection()
    const result = await connection.query('SELECT * FROM x')
    await connection.release()
    console.log(result)
  }
  catch(ex) {
     throw new Error(ex)
  } 
}

当我调用该函数时:

UnhandledPromiseRejectionWarning:错误:错误:ER_NO_SUCH_TABLE:表“test.x”不存在。

你能告诉我为什么吗?

【问题讨论】:

    标签: javascript mysql node.js asynchronous es6-promise


    【解决方案1】:

    您收到 UnhandledPromiseRejectionWarning 是因为您没有将 .catch 处理程序添加到 getPosts()


    getPosts()
      .then(console.log)
      .catch(console.error); // You're missing this
    

    或者使用async/await

    try {
        const posts = await getPosts();
        console.log(posts);
    } catch(e) { // Missing this
        console.error(e); 
    }
    

    如果您要在不进行任何修改的情况下再次抛出错误,则无需在 getPosts 函数上添加 try/catch。就让它冒泡,调用getPosts()时处理错误如上图。

    async function getPosts() {
    
        const connection = await dbConnection()
        const result = await connection.query('SELECT * FROM x')
        await connection.release()
        return result;
    }
    

    关于您当前的错误,您正在尝试对不存在的表执行查询。

    您可以通过以下问题了解更多信息:What is an unhandled promise rejection?

    【讨论】:

    • 实际上问题是我在catch 块中愚蠢地抛出了一个JavaScript 错误。 ?
    • 你读过我的答案了吗?,我说的很清楚,There is no need to add a try/catch on your getPosts function if you're going to throw the error again without any modification 吞下代码深处的错误是一个糟糕的逻辑,如果数据库失败,getPosts 应该抛出,你应该抓住当你调用 getPosts 时,不要吞下错误。
    • 实际上我做不到,这是路由处理程序的一部分,我已将其简化为独立功能,只是为了寻求帮助。它必须是 try catch 或 any in place 错误处理,因为函数调用由框架处理,并且默认使用某种内部错误捕获机制。请从我自己的答案中删除反对票。
    • 我不会删除反对票,因为您在我的回答中说了同样的话,并接受了您的回答,确切的信息。
    • 您错过了我的代码抛出未处理错误消息的简单且唯一的事实。错误处理很好,但我愚蠢地重新抛出错误。我显然不想要这种行为,但我太缺乏经验了......
    【解决方案2】:

    你好,过去的自己!

    您的控制台显示一个未处理的错误,因为在您的 catch 块中,您(我曾经)愚蠢地重新抛出了一个 JavaScript 错误。 ?

    只需从您的 catch 中删除 throw new Error(ex) 并使用一些错误处理逻辑对其进行更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2020-08-17
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多