你在这里。看看这个问题与其他知识怎样相连。
选择节点前往页面 · 展开后可留在地图中阅读
一个问题
失败以后,应该重试还是换一个做法?
不存在、不支持、被拒绝和版本冲突,需要不同的处理。
一个 agent 读取报告失败,如果所有错误都被解释成“再试一次”,它可能不断重复同一件不会成功的事。界面也可能只显示“出错了”,让人不知道下一步。
先分清失败的含义:
| 情况 | 它意味着什么 | 一个合理的下一步 |
|---|---|---|
| 资源不存在 | 当前环境无法在该地址找到目标 | 核对地址与资源是否已移动 |
| 操作不支持 | 实现没有提供这种操作 | 查能力,选择受支持的方式 |
| 访问被拒绝或只读 | 这次操作不符合访问限制 | 检查权限或向有权者请求合适操作 |
| 版本冲突 | 修改基于已过时的版本 | 读取新内容,决定如何处理差异 |
AFS 用不同错误码表达这些类别。对程序而言,按错误类别处理,比只匹配一句给人看的错误文字更可靠。
重试仍有用途,例如暂时网络中断;但要考虑动作是否已经产生效果。一次投票请求没有收到回应,不足以判断票一定没有记入。应用需要根据动作的重试约定确认状态,不能无条件重复调用。
稳定的操作语义也包括失败:调用者应知道什么没有发生、什么仍不确定,以及下一步能做什么。
继续深入
检查一下理解
投票请求没有收到回应,能否立刻断定投票失败并重复提交?
不能。动作可能已经执行,应依据重试约定确认状态,避免重复效果。
沿着学习路径继续
- 从找到资源,到可靠地操作它第 6 / 6 步
- 让资源跨越进程边界第 5 / 5 步