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

Puppeteer启动的browser在try-catch块外无法访问问题解析

为什么try块内定义的browser变量在块外无法访问?

这是JavaScript块级作用域的规则导致的:

  • 你在try块里用const browser = await puppeteer.launch()声明变量,const(包括let)声明的变量属于块级作用域——它们的有效范围只限于包裹它们的那个{}代码块(这里就是try块)。一旦跳出这个块,外部就找不到这个变量了,所以你在try-catch外面调用browser时,会直接抛出ReferenceError。
  • 对比你用的var cnt_pages,var是函数级作用域,所以在整个async函数里都能访问,但browser是const声明的,不受这个规则影响。
  • 报错里的UnhandledPromiseRejectionWarning,是因为async函数里的代码抛出了未捕获的错误(找不到browser),Promise被拒绝但没处理,所以触发了警告。

修复方案

把browser的声明提升到try块外面,放到整个async函数的作用域里:

"use strict";
const puppeteer = require("puppeteer");

(async () => {
  let browser; // 先在函数作用域声明变量
  try {
    browser = await puppeteer.launch();
    console.log(`browser=${browser}`);
    var cnt_pages = (await browser.pages()).length;
    console.log(`${cnt_pages} pages`);
  } catch (error) {
    console.error(error);
    console.error(`can not launch`);
    process.exit();
  }
  console.log(`browser=${browser}`);

  var cnt_pages = (await browser.pages()).length;
  console.log(`cnt_pages ${cnt_pages}`);
  // 注意:Node.js没有全局input函数,需替换为readline模块或其他交互方式
})();

这样browser变量的作用域覆盖整个async函数,不管是try块内还是外面都能正常访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:01:03