← 中文资源

简体中文版本

用枚举分类可重试错误

把传输、超时与校验失败建模为同一个错误枚举,实现 Display 与 Error,并提供无需字符串匹配的可重试判断。

阅读英文原文

功能说明

示例用一个 AppError 枚举统一表示传输失败、超时和字段校验失败,并为它实现 Display 与 Error。is_retryable 用 matches! 只把传输与超时归为可重试,校验错误则直接返回给调用方。classify 根据枚举分支给出处理建议,整个过程不需要把错误转成字符串再做匹配。

关键代码

fn is_retryable(&self) -> bool {
    matches!(
        self,
        AppError::Transport { .. } | AppError::Timeout { .. }
    )
}

{ .. } 忽略结构体变体的具体字段,只按变体种类判断,新增字段时无需修改这里。

使用注意

  • 枚举变体携带结构化字段,日志中可以精确记录 endpoint、超时毫秒数或出错字段。
  • impl Error for AppError {} 使用默认的 source,如需错误链应手动返回内部错误。
  • 真实项目常配合 thiserror 减少样板代码,示例保留手写实现以便观察细节。
  • 可重试判断属于业务策略,不应把“所有网络错误”一概视为可重试。
  • 对外 API 返回错误时应避免泄露内部 endpoint 等敏感信息。

验证方式

运行示例会依次打印三条错误及处理建议:传输与超时显示 retry with backoff,校验错误显示 return to caller。可以新增一个 RateLimited 变体并调整 matches!,确认分类逻辑集中在一处。