跳转到内容

错误参考

本页涵盖 contract.WriteError 可产生的每种错误类型。每条目包含 ErrorType 常量、映射的 HTTP 状态码、触发场景、JSON 报文示例和修复建议。

完整 API 见 contract API 参考;错误处理模式见 错误处理指南

常量HTTP分类使用场景
TypeRequired400validation必填字段或参数缺失
TypeValidation400validation字段存在但未通过校验规则
TypeInvalidFormat400validation格式错误(UUID、邮箱、日期)
TypeOutOfRange400validation数值或日期超出允许范围
TypeDuplicate400validation值必须唯一但已存在
TypeUnauthorized401auth凭证缺失或格式错误
TypeInvalidToken401authToken 存在但签名无效
TypeExpiredToken401authToken exp 字段已过期
TypeForbidden403auth已认证但缺少操作权限
TypeNotFound404resource资源不存在
TypeConflict409resource状态冲突(如并发更新)
TypeAlreadyExists409resource唯一约束冲突
TypeGone410resource资源已永久删除
TypeRateLimited429rate_limit请求频率超出限制
TypeInternal500server服务端故障
TypeUnavailable503server下游依赖不可用
TypeTimeout504server上游调用超时

每条错误响应使用相同的信封结构:

{
"error": {
"type": "not_found",
"code": "NOT_FOUND",
"message": "user not found",
"category": "resource_error",
"severity": "error",
"details": { "id": "user_42" }
},
"request_id": "req-abc-123"
}

常量type使用场景
TypeRequiredrequired_field_missing必填参数或字段缺失
TypeValidationvalidation_error字段存在但未通过业务规则
TypeInvalidFormatinvalid_format格式错误(UUID、email、日期等)
TypeInvalidJSONinvalid_json请求体不是合法 JSON
TypeOutOfRangeout_of_range值超出允许范围
TypeDuplicateduplicate_value值已存在(唯一约束)
if r.URL.Query().Get("name") == "" {
contract.WriteError(w, r, contract.NewErrorBuilder().
Type(contract.TypeRequired).
Detail("field", "name").
Message("name is required").
Build())
return
}

常量type使用场景
TypeUnauthorizedunauthorized缺少有效凭证
TypeInvalidTokeninvalid_tokenToken 格式错误或签名无效
TypeExpiredTokenexpired_tokenToken 已过期

TypeInvalidToken 排查:

现象检查点
有效 Token 被拒绝确认中间件和 issuer 使用相同的签名密钥和 JWTManager
签名不匹配验证密钥存储在 issue 和 verify 之间未重新初始化

常量type使用场景
TypeForbiddenforbidden已认证但无权限

常量HTTPtype使用场景
TypeNotFound404not_found资源不存在
TypeConflict409conflict状态冲突(并发更新)
TypeAlreadyExists409already_exists资源已存在
TypeGone410gone资源已永久删除
if err == sql.ErrNoRows {
contract.WriteError(w, r, contract.NewErrorBuilder().
Type(contract.TypeNotFound).
Detail("id", id).
Message("user not found").
Build())
return
}

常量type使用场景
TypeRateLimitedrate_limited超出请求速率限制

常量HTTPtype使用场景
TypeInternal500internal_error服务端故障,非客户端问题
TypeUnavailable503service_unavailable下游依赖不可用
TypeTimeout504timeout上游调用超时

TypeInternal 注意事项: 绝不在 message 中暴露堆栈、SQL 错误或内部细节;服务端记录日志,客户端返回通用消息。


现象最可能原因修复
Handler 对错误返回 HTTP 200误用 WriteResponse替换为 WriteError 加正确构建器
错误信封中缺少 request_idmiddleware/requestid 未注册Prepare 前通过 app.Use(...) 添加
Handler 重复写入响应体WriteError 后未立即 return每个 WriteError 之后加 return
错误类型太宽泛总用 TypeInternalTypeValidation从上方目录选择最精确的类型