0

0

如何正确捕获 fetch 请求中的网络错误与 HTTP 错误(如 500)

花韻仙語

花韻仙語

发布时间:2026-01-04 16:46:01

|

329人浏览过

|

来源于php中文网

原创

如何正确捕获 fetch 请求中的网络错误与 HTTP 错误(如 500)

fetch 返回 promise,网络异常(如断网)会触发 `catch`,但 http 状态码错误(如 500、404)仍返回 `response` 对象,需手动检查 `response.ok` 或 `response.status`;直接用 `.then().catch()` 无法捕获网络失败,而 `try/catch` 配合 `await` 才能统一处理异步错误流。

fetch 的行为常被误解:它仅在网络请求完全失败时(如 DNS 解析失败、连接中断、CORS 拒绝)才 reject Promise;而服务器返回 500、404、401 等 HTTP 错误状态码时,fetch 仍会 resolve,并返回一个 Response 实例——此时 response.ok 为 false,response.status 为对应状态码(如 500),但你不会进入 Promise 的 rejection 分支

因此,以下写法是错误的预期:

fetch('/api/data', { method: 'POST', body })
  .then(res => {
    // ❌ 这里 res.status 可能是 500,但代码仍会执行到这里!
    console.log(res.status); // 500
  })
  .catch(err => {
    // ✅ 仅触发于网络级失败(如 TypeError: Failed to fetch)
    console.error('Network error:', err);
  });

✅ 正确做法:始终检查 response.ok 或显式判断 response.status >= 400,并将逻辑组织为 async/await 结构,便于统一错误处理:

async function callApi(url, options = {}) {
  try {
    const response = await fetch(url, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      ...options,
    });

    // ✅ 检查 HTTP 状态码是否成功(200–299)
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status} ${response.statusText}`);
    }

    return await response.json(); // 或 response.text(), response.blob() 等

  } catch (err) {
    // ? err 是网络异常(如 TypeError)或我们手动抛出的 HTTP 错误
    console.error('Request failed:', err.message);

    // 可根据 err.name 或 err.message 类型做精细化处理
    if (err.name === 'TypeError' && err.message.includes('fetch')) {
      throw new NetworkError('Network unavailable or CORS blocked');
    }

    throw err; // 重新抛出,交由上层处理
  }
}

// 使用示例
callApi('/api/submit', { body: JSON.stringify({ data: 1 }) })
  .then(data => console.log('Success:', data))
  .catch(err => alert(`Failed: ${err.message}`));

⚠️ 注意事项:

  • 不要依赖 .catch() 捕获 500 错误——它只捕获 Promise rejection(即网络失败),不捕获业务级 HTTP 错误;
  • response.status 和 response.statusText 仅在 response 实例存在时可读,因此必须先确保 fetch 成功 resolve(即未进入 catch);
  • 若需在 then 链中处理,也可用 .then(res => res.ok ? res.json() : Promise.reject(new Error(...))),但 async/await 更清晰易维护;
  • 对于 TypeScript 项目,建议封装为返回 Promise> 的泛型函数,并联合类型区分 success | error 状态。

总结:fetch 的设计哲学是「网络层与应用层分离」——它把连接可靠性交给 Promise 机制,把语义化错误(如 500)留给开发者判断。掌握这一原则,才能写出健壮、可调试的前端 API 调用逻辑。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

405

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

531

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

308

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

184

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

271

2023.10.25

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

298

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

394

2023.10.12

免费看漫画app合集_2026免费漫画app排行榜入口
免费看漫画app合集_2026免费漫画app排行榜入口

2026年免费漫画APP合集来啦!为你精心整理最新免费漫画APP排行榜入口,涵盖漫蛙漫画、香香漫画、包子漫画等热门神器,海量正版国漫、日漫、韩漫资源全免费阅读,无需付费解锁章节!高清全彩画质、每日极速更新,支持离线下载、智能推荐、条漫阅读模式,热血、恋爱、悬疑、古风、搞笑等题材应有尽有。无论你是追新番老粉还是小白漫迷,这里都能让你一站式追漫到爽,告别广告干扰和会员套路!赶紧点击入口下载体验,开启2026无限免费漫画之旅吧!

13

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.1万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号