最危险的失败是"没有报错"
有一类失败最难发现 ✗:系统"成功"返回了 ✔,但结果是错的或空的 ✔ ——
**没有异常、没有报警、指标也正常** ✔(因为接口确实 200 ✔)。
**这类"沉默失败"要靠专门的守卫来抓** ✔。
一、六种沉默失败
```
① 返回空结果但状态成功(检索没命中,却当"没有相关内容"返回)
② 答案格式对但内容空洞("这取决于具体情况")
③ 静默降级(走兜底但未标注,见降级链那篇)
④ 静默截断(输入/输出被切但没有说明)
⑤ 默认值兜底(字段缺失时用默认值填上,且不告知)
⑥ 部分成功(10 条里成功 3 条,只报成功)
```
**第 ① 与 ⑤ 项最常见** ✗→✔。
二、五个守卫
| 守卫 | 抓什么 |
|---|---|
| **空结果率**(按功能) | ①(突然升高说明检索或解析坏了 ✔) |
| **答案长度下限** | ②(低于阈值触发复核 ✔) |
| **降级标注率** | ③(降级了就必须有标注 ✔) |
| **截断计数** | ④(截断必须计数并呈现 ✔) |
| **默认值使用率** | ⑤(按字段统计 ✔ —— 高说明上游缺失 ✔) |
| **部分成功明细** | ⑥(必须报"成功 3 / 失败 7" ✔) |
**要点**:**每个守卫都要有阈值与告警** ✗ ✔,否则等于没有 ✔。
三、为什么"指标正常"也会出事
因为常规指标看的是**错误率**(异常/失败 ✔),
而沉默失败**不产生错误** ✔ —— 它产生的是"看起来正常的坏结果" ✔。
**所以必须监控"结果质量的下限",而不仅是错误率** ✔:
四、三个反模式
五、一条判据
> 让系统"静默返回空结果" ✔,多久会被发现 ✔?
> 如果只能靠用户投诉才发现,说明沉默失败没有守卫 ✗。