尝试/捕获块和未处理的承诺异常

时间:2018-07-04 14:18:05

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

我想测试我的异步功能,查询一个不存在的表。因此,该错误是有意产生的。

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

你能告诉我为什么吗?

2 个答案:

答案 0 :(得分:3)

由于没有向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函数上添加getPosts。只是让它冒泡,并在调用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?

答案 1 :(得分:0)

你好,我过去!

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

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