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

为何fetch的catch触发逻辑取决于第一个then的响应处理方式?

为什么Fetch在404时用res.text()走SUCCESS,res.json()却走FAIL?

这问题我刚上手fetch的时候也懵过!其实核心是要搞懂fetch的错误触发逻辑,咱们一步步拆解你的三个场景:

先明确fetch的核心规则

fetch的catch分支只会在网络请求彻底失败的时候触发——比如DNS找不到服务器、连接超时、浏览器拦截了跨域请求这类情况。而像404、500这类HTTP错误状态码,fetch会认为“请求已经成功发送并收到了服务器响应”,所以会正常走到then链里,不会直接触发catch。

你的三个场景逐一解释

  • 场景1:404+res.text()走SUCCESS
    Reddit的404页面其实会返回一个合法的HTML响应体,res.text()的作用就是把响应体解析成纯文本,这个过程完全没问题,不会抛出错误,所以第二个then顺利执行,打印SUCCESS。

  • 场景2:404+res.json()走FAIL
    同样是404,但res.json()会尝试把响应体解析成JSON格式。可Reddit返回的404是HTML,不是合法的JSON,这时候解析过程就会抛出语法错误,这个错误会被后续的catch捕获,所以就打印FAIL了。

  • 场景3:不存在的服务器地址+res.text()走FAIL
    这种情况属于网络层面的彻底失败——浏览器连目标服务器都找不到,根本发不出请求,更拿不到任何响应体,所以fetch直接触发catch,不管你用res.text()还是res.json()都会走到FAIL分支。

补充你提到的规避方法

你说的if (!res.ok) throw new Error();是标准做法,因为fetch默认不把HTTP错误当成reject,所以需要我们手动检查响应的ok属性(或者status状态码),主动抛出错误来让catch分支处理HTTP错误场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:43:53