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

如何捕获Puppeteer中未await异步函数在try/catch内抛出的错误?

Puppeteer异步错误捕获优化方案

你的核心需求是:执行冗长Puppeteer Web流程时,无需逐步骤显式等待捕获低频率页面错误,但要能在错误出现时立刻中断主流程并捕获有效错误信息。现有代码的问题在于,未使用await调用的listenForError抛出的错误无法被try/catch捕获;若使用await则会阻塞主流程,无法并行执行核心业务逻辑。

优化方案:用Promise.race并行监听错误与主流程

Promise.race支持多个Promise同时执行,只要其中一个Promise状态变更(完成或拒绝),就会返回该Promise的结果。利用这个特性,可让错误监听和主流程并行运行,一旦错误出现,立刻中断主流程并抛出错误,同时被外层try/catch捕获。

重构后的代码示例

async function runCode() {
  try {
    const page = await browser.open(url); // 原代码漏加await,此处补上
    // 并行执行主流程与错误监听
    await Promise.race([
      longWebFlow(page), // 传入page对象执行主流程
      listenForError(page) // 持续监听页面错误
    ]);
  } catch (err) {
    return err.message;
  }
}

async function listenForError(page) {
  await page.waitForXPath(errorMessageXPath);
  throw new Error('Error found!');
}

try {
  const result = await runCode();
  if (result) {
    console.log(result); // 打印捕获到的错误信息
  } else {
    console.log('流程执行完成,未出现错误');
  }
} catch (err) {
  console.log(err.message);
}

关键说明

  1. 修复原代码疏漏:browser.open是异步方法,必须添加await才能获取正确的page对象,原代码此处存在错误。
  2. Promise.race的核心作用:将主流程和错误监听放入Promise.race后,两者并行执行。若错误监听先触发(页面出现错误元素),会立即抛出错误并被runCode的try/catch捕获;若主流程先完成,则正常结束,不会触发错误逻辑。
  3. 错误监听的持续性:page.waitForXPath会持续等待目标错误元素出现,只要主流程执行过程中错误元素出现,就会立刻中断主流程并抛出错误。

内容的提问来源于stack exchange,提问作者Cameron Sima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:20:27