识别服务夜间维护,接口返回 200 但 data 是空数组,入库脚本把空串写进字段,第二天导出全是空白单。乍看像缓存或者权限的锅,追下去往往不是。

if resp.status_code != 200 or resp.json().get('code') != 0:
    raise RuntimeError(resp.text[:200])

追下去是这么回事:接口把业务失败包在 200 里,用 code 字段区分,脚本只判断 HTTP 状态码。空数组和真没文字在结构上看不出差别。

「识别失败静默处理」这类改动最怕改一半,回滚脚本先准备好,再动生产。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

具体做法是,同时校验 HTTP 状态和 body 里的 code;空结果记成失败 不要写空串;落库前对必填字段做非空断言;失败条目进重试表并计数。

验收就看一点,维护窗口期间任务标红 没有空串落库 恢复后自动补跑。

作者 9823189