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

JavaScript fetch()无法捕获404错误的问题求助

解决fetch()无法捕获404错误的问题

嘿,我太懂你遇到的这个问题了——fetch()函数的经典坑就在这儿:它不会自动把HTTP错误状态码(比如404、500这类)当成rejected Promise,只有当出现真正的网络故障(比如断网、域名解析失败)时,才会触发Promise的reject逻辑。你已经在代码里加了res.ok的判断,但可能没完善错误捕获的链路,或者没处理Promise集合的rejection。

问题根源

fetch()的设计逻辑是:只要服务器返回了HTTP响应(哪怕是404/500),Promise就会进入resolved状态,只有完全连不上服务器的时候才会reject。所以你必须手动检查响应的状态码,主动抛出错误才能让后续的catch捕获到。

修复后的代码

我帮你调整了代码,完善了错误捕获逻辑,同时优化了then链的结构:

function promiseBatchDomains(domainsToQuery) { 
  const batchSize = domainsToQuery.length 
  let currentDomain = 0 
  const promises = domainsToQuery.map(domain => ( 
    fetch(`https://api-url-omitted/${domain}`) 
      .then(res => { 
        // 当状态码不在200-299区间时,主动抛出错误
        if (!res.ok) { 
          throw new Error(`HTTP ${res.status} (${res.statusText}) for domain: ${domain}`);
        } 
        // 直接在这里解析JSON,简化后续then链
        return res.json(); 
      }) 
      .then(data => { 
        currentDomain += 1 
        console.log(`${currentDomain} of ${batchSize}: ${domain} data received.`)
        // 返回数据,方便后续批量处理
        return { domain, data, success: true };
      })
      .catch(error => {
        // 单独处理每个请求的错误,避免单个失败中断整个批量任务
        console.error(`Failed to process ${domain}:`, error.message);
        // 返回错误标记,让Promise.all能收集到所有结果
        return { domain, error: error.message, success: false };
      })
  ))

  // 返回所有Promise的集合,让调用方可以处理最终结果
  return Promise.all(promises);
}

关键优化点

  • 主动抛出带上下文的错误:抛出错误时带上状态码、状态文本和域名,方便你快速定位哪个域名出了问题
  • 简化then链:把res.json()移到第一个then里,减少不必要的链式调用
  • 单个请求的错误隔离:每个fetch都单独加catch,这样某个域名请求失败时,不会影响其他域名的处理,同时能把错误信息收集到最终结果里
  • 返回Promise.all结果:让调用这个函数的地方可以拿到所有请求的成功/失败数据,做后续处理

额外提示

如果你的业务逻辑是“只要有一个请求失败就终止所有任务”,那可以去掉单个fetch的catch,转而在Promise.all后面统一加catch:

return Promise.all(promises)
  .then(results => {
    console.log('All requests completed successfully');
    return results;
  })
  .catch(globalError => {
    console.error('One of the requests failed:', globalError);
    // 这里可以做全局错误处理,比如终止后续流程
  });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:01:33