fetch api 在 http 请求成功完成(即网络通畅且无 dns 解析错误等底层故障)时,默认不会抛出异常,而是返回一个 response 对象。即使服务器返回了 404 或 500 状态码,fetch() 的 promise 依然会 resolve。要处理这些 http 错误,必须在获取到 response 后,手动检查其 ok 属性或 status 字段,若为 false 则主动抛出错误。

如何判断 Fetch 响应是否成功
通过检查 response.ok 属性可以确定 HTTP 状态码是否在 200 到 299 之间。如果该属性为 false,说明发生了 HTTP 错误,此时应读取 response.status 和 response.statusText 来获取具体的错误信息并抛出异常。

async function fetchData(url) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
}上述代码展示了标准的错误处理模式。调用 fetchData('https://api.example.com/data') 时,如果服务器返回 404,程序将抛出包含状态码信息的错误。预期结果是控制台输出类似 Error: HTTP error! status: 404 的信息,或者被外层的 try...catch 捕获。
立即学习“Java免费学习笔记(深入)”;
如何处理 JSON 解析失败的情况
当服务器返回非 JSON 内容(如 HTML 错误页面)或 JSON 格式损坏时,调用 response.json() 会抛出 SyntaxError。这种错误属于数据层面的问题,而非网络层面的 HTTP 错误,因此需要单独处理。

async function parseJsonData(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
if (error instanceof SyntaxError) {
console.error('JSON parsing failed:', error.message);
} else {
console.error('Fetch failed:', error.message);
}
}
}这段代码结合了 HTTP 状态检查和 JSON 解析错误处理。如果请求成功但返回的是纯文本而非 JSON,response.json() 会触发 SyntaxError。预期结果是控制台打印出 JSON parsing failed: Unexpected token ...,从而区分网络/HTTP 错误与数据格式错误。
基于超时条件如何中断 Fetch 请求
使用 AbortController 可以在指定时间内取消未完成的请求,防止请求挂起。通过监听 signal 并在超时时调用 abort(),可以优雅地终止 Fetch 操作。
async function fetchWithTimeout(url, timeoutMs) {
const controller = new AbortController();
const id = setTimeout(() => controller.abort(), timeoutMs);
try {
const response = await fetch(url, { signal: controller.signal });
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
if (error.name === 'AbortError') {
console.error('Request timed out');
} else {
console.error('Fetch failed:', error.message);
}
} finally {
clearTimeout(id);
}
}调用 fetchWithTimeout('https://slow-api.com/data', 2000) 时,如果请求在 2 秒内未完成,控制器将中止请求。预期结果是控制台输出 Request timed out,并且不再等待服务器响应。这种方式确保了资源不会被无限期占用。


















