无法捕获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
相关产品推荐
相关产品推荐

