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 块和未处理的承诺异常的主要内容,如果未能解决你的问题,请参考以下文章

mongoose 的重复键错误处理和未处理的承诺拒绝

Node.JS - 无法使用try / catch块获得异步抛出

Angular2“没有 t 的提供者!”和未捕获(承诺):错误:DI 错误

处理承诺异常的问题

如何在使用同构获取的异常处理承诺后解析 json

异常处理----使用 try…catch…finally 处理异常