本人github
正确的,当使用 fetch
API 进行网络请求时,如果服务器返回一个 4xx(例如 400 Bad Request)或 5xx(例如 500 Internal Server Error)等错误状态码,fetch
不会自动抛出一个错误。相反,fetch
仅在遇到阻止请求完成的网络故障时(例如网络中断)才会抛出错误。对于 HTTP 错误状态码,fetch
会正常解析响应,并将其视为已成功解决(resolved)的 Promise
。
这意味着你需要手动检查响应的 .ok
属性,该属性是一个布尔值,当响应的状态码在 200-299 的范围内时为 true
,表示请求成功。如果 .ok
属性为 false
,你可以抛出一个错误或以其他方式处理这种情况。
示例:处理 fetch 中的 400 错误
fetch('https://example.com/data')
.then(response => {
if (!response.ok) {
// 抛出一个错误,包括状态码和状态文本
throw new Error('Network response was not ok: ' + response.statusText);
}
return response.json(); // 解析 JSON 数据
})
.then(data => {
console.log(data); // 处理数据
})
.catch(error => {
console.error('There has been a problem with your fetch operation:', error);
});
在这个示例中,如果响应的 .ok
属性为 false
(意味着状态码不在 200-299 范围内),将抛出一个错误。这个错误随后会被 .catch()
块捕获,允许你统一处理成功请求和错误情况。
为什么 fetch 不自动抛出错误?
fetch
的设计哲学是:只要服务器的响应可以接收,不管其 HTTP 状态码如何,都应该由开发者来决定如何处理这个响应。这提供了更大的灵活性,因为在某些应用场景中,一个 4xx 或 5xx 的响应可能包含对开发者有用的信息,并不总是代表一个无法恢复的错误状态。
总之,使用 fetch
时,你应该总是检查响应的 .ok
属性或直接检查 .status
属性,以便正确处理所有可能的响应状态。