为什么接口调用总出问题
做开发时,调用第三方接口是家常便饭。天气预报、支付系统、短信验证码,哪个不是靠接口跑起来的?可一旦对方服务不稳定,或者网络抖动,你的程序就可能直接崩掉。用户点个按钮没反应,页面白屏,客服电话立马被打爆。
其实大多数问题,根本不需要等到崩溃才处理。只要在接口调用时做好异常捕获,就能把“炸锅”变成“小提醒”。
常见的异常类型
网络超时、服务器500错误、返回格式不一致,这些都属于典型异常。有些开发者只处理了成功逻辑,一遇到非200状态码就抛错,结果日志里全是堆栈,问题却没人发现。
比如你调一个获取用户信息的接口,正常返回是JSON:
{"code": 0, "data": {"name": "张三", "age": 28}}但对方服务出问题时,可能返回的是:
<html><body>502 Bad Gateway</body></html>这时候如果你直接解析JSON,程序就会直接报错退出。
用 try-catch 捕获请求异常
以 JavaScript 为例,使用 fetch 调接口时加上 try-catch 是基本操作:
async function getUserInfo() {
try {
const res = await fetch('/api/user');
if (!res.ok) {
throw new Error(`HTTP ${res.status}`);
}
const data = await res.json();
return data;
} catch (err) {
console.error('获取用户信息失败:', err.message);
return null;
}
}这样即使接口出问题,函数也能安全返回 null,而不是让整个页面挂掉。
别忘了超时控制
有时候接口不报错也不响应,卡着不动,用户只能干等。这种情况需要设置超时机制。
Node.js 中可以用 AbortController 控制请求超时:
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000);
try {
const res = await fetch('/api/data', { signal: controller.signal });
clearTimeout(timeoutId);
// 处理响应
} catch (err) {
if (err.name === 'AbortError') {
console.log('请求超时');
} else {
console.log('其他错误:', err.message);
}
}设置5秒超时,避免用户无限等待。
统一处理提升效率
项目大了,每个接口都写一遍 try-catch 太重复。可以把异常处理封装成通用请求函数:
async function request(url, options = {}) {
try {
const res = await fetch(url, options);
if (!res.ok) throw new Error(res.statusText);
return await res.json();
} catch (err) {
// 统一上报监控系统
reportErrorToMonitor({ url, error: err.message });
// 可在此弹提示框或重试
showNetworkErrorTip();
throw err;
}
}这样一来,所有接口调用都能自动带上异常处理,维护成本大大降低。
异常捕获不是为了掩盖问题,而是为了让程序更有韧性。该提醒的提醒,该兜底的兜底,用户感知到的才是“好用”的系统。