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

无法捕获Async函数抛出的错误?技术问题咨询

为什么foo的catch块没捕获到错误?

你写的代码里,waitAndMaybeReject是async函数,调用它会直接返回一个Promise对象——不管这个Promise最终是resolve还是reject,调用waitAndMaybeReject()这行代码本身不会同步抛出错误。

在foo的try块里,你只是直接return了这个Promise,没有用await去等待它的状态结果。这就意味着try块里的代码执行时完全没有同步异常,自然不会触发catch块。

要让catch块捕获到waitAndMaybeReject抛出的错误,你需要用await等待这个Promise完成:

async function waitAndMaybeReject() {
  
  await new Promise(r => setTimeout(r, 5000));
  
  const isHeads = false;
  //const isHeads = true;

  if (isHeads) return 'yay';
  throw Error('Boo!');
}


async function foo() {
  try {
    // 加await等待Promise状态,拒绝时会抛出错误被catch捕获
    return await waitAndMaybeReject();
  }
  catch (e) {
    return 'caught';
  }
}
foo();

核心逻辑:

  • 直接return async函数的返回值,相当于把这个Promise原封不动地抛给foo()的调用者,错误会由foo()返回的Promise的catch方法处理,而不是foo内部的catch块。
  • 用await后,async函数会暂停等待Promise完成,一旦Promise拒绝,await会把拒绝原因转换成同步错误,这时候try/catch就能捕获到。

内容的提问来源于stack exchange,提问作者A Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:46:07