如何识别存在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
相关产品推荐
相关产品推荐

