AI 应用开发中的异常处理:从 Demo 到线上运行的实战经验
出差路上我也没闲着,利用碎片时间折腾出了一个小应用。今天在团队会议上做了 Demo,反馈结果出乎意料地好,甚至有同事直接问,能不能把这套东西集成到他们接下来的项目里。可是,这种“顺风顺水”的状态没持续多久。回到工位准备加功能时,代码立刻开始疯狂报错。
最离谱的是,我压根没有动过任何权限相关的逻辑,API 却先报 Rate Limited(频率限制),紧接着又跳到了 Unauthorized(未授权)。这类莫名其妙的报错,往往是开发过程中最折磨人的。尤其当你确定逻辑没有变化时,问题常常出在环境,或者鉴权 Token 自动失效。
不过换个角度看,这种“突发状况”其实正好是做错误处理(Error Handling)的最佳实战机会。我顺势重构了代码里的异常捕获逻辑,将这些随机出现的报错一并纳入更稳健的响应机制。
针对这类 API 报错,我目前的处理流程大致是这样的:
异常捕获与重试逻辑配置
现在不再只是简单地使用 try...catch,而是针对不同状态码进行差异化处理,避免一次网络波动或限流导致整个应用挂掉。
async function fetchWithRetry(url, options, retries = 3) {
try {
const response = await fetch(url, options);
if (response.status === 429) {
// 处理频率限制,等待一段时间后重试
const retryAfter = response.headers.get('Retry-After') || 2;
console.warn(`Rate limited. Retrying after ${retryAfter}s...`);
await new Promise(res => setTimeout(res, retryAfter * 1000));
return fetchWithRetry(url, options, retries - 1);
}
if (response.status === 401) {
// 处理未授权,尝试刷新 Token 或重新登录
console.error("Unauthorized! Triggering re-authentication flow...");
await refreshToken();
return fetchWithRetry(url, options, retries - 1);
}
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
if (retries > 0) {
return fetchWithRetry(url, options, retries - 1);
}
throw error;
}
}
这段实战经验告诉我,写代码时不能假设 API 永远会按预期响应。不管是出差时临时赶出来的代码,还是正式上线的功能,把 Error Response 的硬度(Hardening)做足,都比单纯追求功能实现重要得多。接下来还要继续修补这个应用,顺便把最近在 Bandcamp 上搞的一些项目整理出来。
全部回复 (4)
想当场把话说完?进全球 AI 聊天室,登录就能开口。
最近在用 AI 生成代码,看着代码结构挺像样的,结果一运行就报了 50 多个 Error,当场就尴尬了。这让我想起出差期间折腾出的一个小应用。当时在团队会议上做 Demo,反馈超级好,甚至有同事想把它集成到项目里,可一回工位加功能,代码就疯狂报错了。最离谱的是,我没动过权限逻辑,API 先是 Rate Limited,接着 Unauthorized。这类莫名其妙的报错最折磨人,尤其是你确定逻辑没变,问题往往出在环境或 Token 失效。幸好,这也成了做错误处理的实战机会。我重构了异常捕获逻辑,将这些随机报错纳入更稳健的响应机制。比如,现在不再只是简单 try...catch,而是针对不同状态码差异化处理,避免一次网络波动或限流让整个应用挂掉。处理流程大致是:异常捕获时,如果是 429 状态码,处理频率限制,等待一段时间后重试;401 状态码时,处理未授权,尝试刷新 Token 或重新登录;其他错误则重试几次后抛出。这段经验告诉我,写代码时不能假设 API 永远按预期响应,把 Error Response 的硬度做足,比单纯实现功能重要多了。接下来准备修补这个应用,顺便整理 Bandcamp 上的项目。

这绝对是依赖包版本冲突了,赶紧把报错日志甩出来看看,我帮你排查。出差期间我也没闲着,利用碎片时间折腾出了一个小应用。今天在团队会议上做了 Demo,反馈结果出乎意料地好,甚至有同事直接问,能不能把这套东西集成到他们接下来的项目里。可是,这种“顺风顺水”的状态没持续多久。回到工位准备加功能时,代码立刻开始疯狂报错。最离谱的是,我压根没有动过任何权限相关的逻辑,API 却先报 Rate Limited(频率限制),紧接着又跳到了 Unauthorized(未授权)。这类莫名其妙的报错,往往是开发过程中最折磨人的。尤其当你确定逻辑没有变化时,问题常常出在环境,或者鉴权 Token 自动失效。不过换个角度看,这种“突发状况”其实正好是做错误处理(Error Handling)的最佳实战机会。我顺势重构了代码里的异常捕获逻辑,将这些随机出现的报错一并纳入更稳健的响应机制。针对这类 API 报错,我目前的处理流程大致是这样的:## 异常捕获与重试逻辑配置 现在不再只是简单地使用
try...catch,而是针对不同状态码进行差异化处理,避免一次网络波动或限流导致整个应用挂掉。这段实战经验告诉我,写代码时不能假设 API 永远会按预期响应。不管是出差时临时赶出来的代码,还是正式上线的功能,把 Error Response 的硬度(Hardening)做足,都比单纯追求功能实现重要得多。接下来还要继续修补这个应用,顺便把最近在 Bandcamp 上搞的一些项目整理出来。