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

使用Fetch API时无法捕获错误的技术咨询

问题:fetch返回404时then块仍执行,错误未被catch捕获

我是编程新手,正在尝试实现下载进度功能,以下是我的代码:

let btn = document.querySelector("#img");
btn.addEventListener("click", loadimage);
function loadimage() {
  fetch("https://reqres.in/invalid-url")
    .then(async (res) => {
      let contLength = res.headers.get("content-length");
      let reader = res.body.getReader();
      let downloaded_data = 0; 
      while (true) {
        const { done, value } = await reader.read();
        if (done) {
          console.log("completed");
          break;
        }
        downloaded_data += value.length;
        console.log(downloaded_data);
      }
    })
    .catch(function (err) {
      console.log("catch block");
      console.log(err);
    });
}

我遇到了如下错误,但该错误未被catch块捕获:

GET https://reqres.in/invalid-url 404
6939
completed

为什么明明出现了错误,then块中的函数仍会被执行?我尝试过不同的API,结果都是如此。


解答

这是因为fetch API的设计逻辑:它只有在发生网络层面的错误(比如断网、域名解析失败)时才会触发Promise的reject,进而进入catch块。而像404、500这类HTTP状态码错误,fetch会认为请求已经成功完成(服务器已返回响应),所以会进入then块执行后续逻辑。

要捕获这类HTTP错误,你需要手动在then块里检查响应状态:

  • 用res.ok属性:状态码在200-299范围内时返回true,否则为false
  • 或直接判断res.status,排除4xx、5xx类状态码

修改后的代码示例:

let btn = document.querySelector("#img");
btn.addEventListener("click", loadimage);
function loadimage() {
  fetch("https://reqres.in/invalid-url")
    .then(async (res) => {
      // 先检查HTTP状态是否正常
      if (!res.ok) {
        throw new Error(`HTTP错误:${res.status}`); // 手动抛出错误,触发catch块
      }
      let contLength = res.headers.get("content-length");
      let reader = res.body.getReader();
      let downloaded_data = 0; 
      while (true) {
        const { done, value } = await reader.read();
        if (done) {
          console.log("completed");
          break;
        }
        downloaded_data += value.length;
        console.log(downloaded_data);
      }
    })
    .catch(function (err) {
      console.log("catch block");
      console.log(err);
    });
}

这样当请求返回404时,代码会手动抛出错误,进而触发catch块执行,就能捕获到HTTP错误了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:25:16