功能说明
示例用一个 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!,确认分类逻辑集中在一处。