You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中使用try/catch无法捕获异步抛出的错误问题

为啥你的async/await会出现UnhandledPromiseRejectionWarning?

兄弟,我太懂你这个困惑了——明明加了try/catch,为啥还是蹦出这个警告?其实问题大概率出在你调用async函数的方式上,咱们一步步拆解:

先看你可能踩的坑:调用async函数没加await

举个你可能写的错误代码例子:

async function myAsyncFunc() {
  try {
    // 假设这个Promise会拒绝
    await Promise.reject('出问题了');
  } catch (err) {
    // 你觉得抛出错误后外面能抓到
    throw new Error(`捕获到内部错误:${err}`);
  }
}

// 这里是坑!调用的时候没加await,直接丢进try/catch
try {
  myAsyncFunc(); // 这里返回的是一个Promise,但你没处理它的拒绝
} catch (err) {
  console.log('外部捕获错误:', err);
}

为啥会触发警告?因为myAsyncFunc()是个async函数,它本身返回的就是一个Promise。当你在里面throw错误时,其实是让这个返回的Promise变成了拒绝状态。但上面的调用里,你既没加await把它变成同步等待的逻辑,也没给它加.catch()处理拒绝,Node.js自然会认为这是个未处理的Promise拒绝。

正确的处理方式

方式1:用await包裹async函数调用,放在try/catch里

把调用逻辑放到另一个async函数里(或者用顶级await,如果你的环境支持):

async function main() {
  try {
    await myAsyncFunc(); // 加了await,异步错误会被这里的catch捕获
  } catch (err) {
    console.log('外部捕获错误:', err.message);
  }
}

main();

方式2:直接给async函数的返回Promise加.catch()

如果你不想用await,也可以直接用Promise的链式调用处理拒绝:

myAsyncFunc().catch(err => {
  console.log('外部捕获错误:', err.message);
});

还有一种可能:内部try/catch没覆盖到所有Promise

如果你内部的await没有被try/catch包裹,那也会导致async函数返回的Promise拒绝,比如:

async function myAsyncFunc() {
  // 这里的await没在try/catch里,拒绝会直接冒泡出去
  const res = await Promise.reject('出问题了');
  try {
    // 其他代码
  } catch (err) {
    // 只处理这里的错误
  }
  return res;
}

这种情况你得确保所有可能拒绝的await都被try/catch包裹,或者直接让错误冒泡到外面处理。

记住核心:async函数本质是返回Promise的语法糖,不管你里面怎么throw,最终都是Promise的拒绝状态。要处理这个拒绝,要么用await+try/catch,要么用.catch(),二者选其一就行。

内容的提问来源于stack exchange,提问作者Henrique Borges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:00:03