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

无法捕获response.json()抛出的JSON异常,异常落入全局未捕获处理逻辑的技术求助

解决Puppeteer中res.json()解析异常未被局部try/catch捕获的问题

这个问题我之前也踩过坑,核心原因是**res.json()方法内部的异常有时候会脱离当前async函数的上下文,触发全局的未处理拒绝(unhandledRejection),而不是被局部的try/catch捕获**。下面给你几个切实可行的解决思路:

方案1:手动获取响应文本并自行解析JSON

放弃直接使用res.json(),改为先获取响应的原始文本,再用JSON.parse()手动解析,这样能完全把解析流程纳入你的try/catch控制范围内:

page.on('response', async res => {
  if (res.request().resourceType() === 'xhr' && res.url() === search_prefix) {
    console.log(res.status(), res.url());
    try {
      // 先获取响应原始文本
      const text = await res.text();
      // 手动执行JSON解析
      const data = JSON.parse(text);
      if (data !== undefined && data.status === "success") {
        results = parseResults(data, config);
      }
    } catch (error) {
      // 这里可以稳稳捕获JSON解析异常
      console.warn('JSON解析失败:', error.message);
    }
  }
});

这种方式的优势是完全掌控解析过程,不管响应返回的是无效JSON、空文本还是非JSON格式内容,异常都会被当前的try/catch捕获,不会逃逸到全局处理逻辑中。

方案2:检查全局异常处理的区分逻辑

如果你的代码中有全局异常监听,要注意:async函数中未被捕获的异常会触发unhandledRejection事件,而不是uncaughtException事件。如果你把这两种事件混在一起处理,可能会误以为是局部try/catch没生效。

正确区分的全局处理示例:

process.on('uncaughtException', (err) => {
  console.error('未捕获的同步异常:', err);
});

process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的异步拒绝:', reason);
  // 可针对Puppeteer的响应解析场景做特殊处理
});

不过更推荐方案1,因为它从根源上把异常控制在局部上下文,不需要依赖全局逻辑的调整。

额外排查点

还要确认search_prefix变量是否完全匹配响应的URL——有时候URL可能带参数、存在大小写差异,或是经过重定向后地址变化,导致代码根本没进入try/catch的逻辑块,这也会让你误以为异常没被捕获。可以在判断里加个日志验证:

if (res.request().resourceType() === 'xhr') {
  console.log('当前XHR URL:', res.url()); // 验证是否匹配search_prefix
  if (res.url() === search_prefix) {
    // 原有业务逻辑
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:42:38