Javascript Try/catch块和未处理的承诺异常

Javascript Try/catch块和未处理的承诺异常,javascript,mysql,node.js,asynchronous,es6-promise,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) {

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

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)
  } 
}
当我调用该函数时:

未处理的PromisejectionWarning:错误:错误:ER\u否\u这样的表:表“test.x”不存在


你能告诉我为什么吗?

你得到了
未处理的PromisejectionWarning
,因为你没有向
getPosts()添加
.catch
处理程序


或者使用
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;
}

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


你可以在下面的问题中了解更多信息:

嗨,过去的我自己


您的控制台显示一个未处理的错误,因为在catch块中,您(我)愚蠢地重新抛出了一个JavaScript错误。事实上,问题是我在
catch
块中愚蠢地抛出了一个JavaScript错误。你读过我的答案了吗?我说得很对,
如果你想在不做任何修改的情况下再次抛出错误,那么没有必要在getPosts函数上添加try/catch,
而且在代码深处吞下错误是一个糟糕的逻辑,如果数据库失败,getPosts应该抛出,并且你应该在调用getPosts时捕获它,事实上,我不能这样做,这是路由处理程序的一部分,我在一个独立的函数中简化了它,只是为了寻求帮助。它必须是try-catch或any-in-place错误处理,因为函数调用是由框架处理的,并且默认为某种内部错误捕获机制。请从我自己的答案中删除否决票。我不会删除否决票,因为你说了与我在答案中所做的相同的话,并接受了你的答案,这是确切的信息。你错过了我的代码抛出未处理错误消息的简单且唯一的事实。错误处理很好,但我愚蠢地重复了错误。我显然不想那样做,但我太没经验了……哈哈,对我来说也是一样的问题
async function getPosts() {

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