Try/catch 块和未处理的承诺异常
Posted
技术标签:
【中文标题】Try/catch 块和未处理的承诺异常【英文标题】:Try/catch block and unhandled promise exception 【发布时间】: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”不存在。
你能告诉我为什么吗?
【问题讨论】:
【参考方案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)
并使用一些错误处理逻辑对其进行更改。
【讨论】:
以上是关于Try/catch 块和未处理的承诺异常的主要内容,如果未能解决你的问题,请参考以下文章
Node.JS - 无法使用try / catch块获得异步抛出