Feyra API 错误码规范(Single Source of Truth)

本文档是 Feyra API 错误码的唯一权威来源(SSOT)。所有业务异常必须使用下表中的常量值, 禁止在代码中手写字符串(如 "INVALID_ARGUMENT")。

📌 使用说明:
  • 前端通过 error.details[0].reason 获取错误码,用于精准判断错误类型(如 switch(reason))。
  • 后端抛出异常时,必须使用 Reason.INVALID_ARGUMENT 等常量(来自 app.core.exceptions.Reason)。
  • 新增错误码时 必须同步更新此页面、design_error_handling.md和代码中的 Reason 枚举/常量类。

详细设计请参考: wiki/design/feyra-api/design_error_handling.md

400 Bad Request:客户端参数/语法错误

错误码(reason) 说明
INVALID_ARGUMENT 通用无效参数(如 missing/类型错误)
INVALID_SORT_OPTION 不支持的排序方案
INVALID_PAGINATION_TOKEN 分页令牌无效或已过期
INVALID_DATETIME_FORMAT 时间格式不符合 ISO 8601 标准

401 Unauthorized:认证失败

错误码(reason) 说明
AUTH_TOKEN_MISSING 请求缺少认证令牌(如 JWT)
AUTH_TOKEN_INVALID 认证令牌无效(如签名错误、已过期)
AUTH_TOKEN_REVOKED Token 已被加入黑名单(如用户主动登出、管理员强制失效)
AUTH_TOKEN_MALFORMED Token 格式错误(荷载无效)
AUTH_USER_NOT_FOUND Token 关联的用户不存在

403 Forbidden:权限不足

错误码(reason) 说明
ACCESS_DENIED 用户无权访问该资源或执行该操作
USER_ACCOUNT_DISABLED 用户账户已被禁用

404 Not Found:业务资源不存在

错误码(reason) 说明
RESOURCE_NOT_FOUND 开发者主动抛出:指定业务资源不存在(如用户ID无效)

409 Conflict:资源冲突

错误码(reason) 说明
USER_EMAIL_EXISTS 用户邮箱已存在(注册冲突)

422 Unprocessable Entity:业务规则校验失败

错误码(reason) 说明
FAILED_PRECONDITION 前置条件不满足(如账户已禁用,无法进行后续操作)

框架自动抛出的错误(非业务代码使用)

错误码(reason) 说明
HTTP_404 请求路径不存在(FastAPI 自动返回)
HTTP_405 HTTP 方法不支持(如 POST 到只支持 GET 的路由)

500 Internal Server Error:系统错误

错误码(reason) 说明
INTERNAL_ERROR 仅由全局异常中间件使用,表示未预期的服务器内部错误
⚠️ 重要提醒:

任何新增的业务错误类型,都必须:

  1. 在代码中定义新的 Reason.XXX 常量;
  2. 同步更新本页面,确保前后端认知一致;
  3. 在设计文档中说明使用场景。