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

如何识别存在unhandledRejection的错误Promise?附相关代码

捕获未处理的Promise拒绝(unhandledRejection)

你这段代码的思路完全正确——通过监听Node.js的unhandledRejection全局事件,就能精准捕获那些没被.catch()或try/catch处理的Promise拒绝,同时结合Puppeteer的使用场景做了适配。我把代码补全并优化细节后如下:

// 在文件顶部添加全局事件监听,捕获所有未处理的Promise拒绝
process.on("unhandledRejection", (reason, p) => {
  console.error("Unhandled Rejection at: Promise", p, "reason:", reason);
  // 这里不需要主动关闭浏览器,未处理的拒绝不一定会导致进程崩溃
  // 若需极端情况回收资源,可考虑添加,但要注意避免重复关闭操作
});

const puppeteer = require('puppeteer');

async function getPic() {
  let browser; // 提前声明浏览器变量,确保catch块能访问到
  try {
    // 启动浏览器,可打开headless: false参数调试可视化界面
    browser = await puppeteer.launch(/*{headless: false}*/);
    const page = await browser.newPage();
    await page.setViewport({width: 1000, height: 800}); // 补全视口高度参数

    // 这里添加你的业务逻辑,比如访问页面、截图、数据爬取等
    await page.goto('https://example.com');
    await page.screenshot({path: 'example.png'});

    // 正常流程下关闭浏览器
    await browser.close();
  } catch (error) {
    // 捕获try块中所有被显式处理的Promise拒绝或同步错误
    console.error("业务逻辑执行出错:", error);
    // 出错时确保浏览器被关闭,避免资源泄漏
    if (browser) {
      await browser.close();
    }
  }
}

// 执行主函数
getPic();

关键要点说明:

  • 全局unhandledRejection监听:这个事件会捕获整个Node.js进程中所有未被显式处理的Promise拒绝,比如你在Puppeteer操作中不小心漏掉的.catch(),或者异步函数中没被try/catch包裹的部分。
  • 提前声明浏览器变量:把browser变量提到try块外,确保catch块能判断实例是否存在,避免出现“关闭未启动浏览器”的错误。
  • 双场景关闭浏览器:正常流程完成后关闭,出错时在catch块中兜底关闭,彻底避免浏览器进程残留的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:53:46