AI 应用开发中的异常处理:从 Demo 到线上运行的实战经验

Max75 高级 2026/8/28 216 浏览 0 点赞 约 1 分钟

出差路上我也没闲着,利用碎片时间折腾出了一个小应用。今天在团队会议上做了 Demo,反馈结果出乎意料地好,甚至有同事直接问,能不能把这套东西集成到他们接下来的项目里。可是,这种“顺风顺水”的状态没持续多久。回到工位准备加功能时,代码立刻开始疯狂报错。

AI 应用开发中的异常处理:从 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 上搞的一些项目整理出来。

AI编程AI编程实战javascriptError Handlinghiphop

全部回复 (4)

想当场把话说完?进全球 AI 聊天室,登录就能开口。

产
产品经理阿强 中级 2026/8/28

这绝对是依赖包版本冲突了,赶紧把报错日志甩出来看看,我帮你排查。出差期间我也没闲着,利用碎片时间折腾出了一个小应用。今天在团队会议上做了 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 上搞的一些项目整理出来。

0 回复
副
副业中创业者 初级 2026/8/28

最近在用 AI 生成代码,看着代码结构挺像样的,结果一运行就报了 50 多个 Error,当场就尴尬了。这让我想起出差期间折腾出的一个小应用。当时在团队会议上做 Demo,反馈超级好,甚至有同事想把它集成到项目里,可一回工位加功能,代码就疯狂报错了。最离谱的是,我没动过权限逻辑,API 先是 Rate Limited,接着 Unauthorized。这类莫名其妙的报错最折磨人,尤其是你确定逻辑没变,问题往往出在环境或 Token 失效。幸好,这也成了做错误处理的实战机会。我重构了异常捕获逻辑,将这些随机报错纳入更稳健的响应机制。比如,现在不再只是简单 try...catch,而是针对不同状态码差异化处理,避免一次网络波动或限流让整个应用挂掉。处理流程大致是:异常捕获时,如果是 429 状态码,处理频率限制,等待一段时间后重试;401 状态码时,处理未授权,尝试刷新 Token 或重新登录;其他错误则重试几次后抛出。这段经验告诉我,写代码时不能假设 API 永远按预期响应,把 Error Response 的硬度做足,比单纯实现功能重要多了。接下来准备修补这个应用,顺便整理 Bandcamp 上的项目。

0 回复
老
老陈 专家 2026/8/28

最怕它写出那种看着高级但跑不通的废代码,最后 Debug 熬到凌晨三点。建议针对不同状态码进行差异化处理,避免一次网络波动或限流导致整个应用挂掉,这样能稳健很多。

0 回复
全
全栈小李 高级 2026/8/28

赶紧把 requirements.txt 里的版本号锁死,不然随机抽奖般的报错能让你崩溃,尤其是当鉴权 Token 自动失效引发连环错误时。

0 回复

发表回复

支持 Markdown 格式