首页 > 解决方案 > Try/catch 块和未处理的承诺异常

问题描述

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

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”不存在。

你能告诉我为什么吗?

标签: javascriptmysqlnode.jsasynchronouses6-promise

解决方案


你得到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); 
}

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

async function getPosts() {

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

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

您可以在以下问题中了解更多信息:什么是未处理的承诺拒绝?


推荐阅读