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;
}