错误处理
有效的错误处理能使系统更加健壮、易于调试。本文定义一个通用的错误数据结构,整理了常见的标准错误,对于错误的监控与处理也给出了通用的方案。
#
错误对象错误对象是一个标准的 JSON object,数据结构如下:
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
name | string | 必须 | 可读的唯一名字。例如: UNAUTHORIZED |
message | string | 必须 | 未提供授权信息(Access Token) |
details | array | 可选 | 错误的额外详细信息。error_details 类型数组 |
error_details 对象:
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
field | string | 必须 | 引起错误的字段名称。输入有效性验证时会用到。 |
reason | string | 必须 | 错误的原因。 |
#
认证授权错误认证授权相关的错误只允许返回 401
或 403
。以下是常见的错误类型定义,如果不能满足业务需求可以在此基础上扩展细化。
状态码 | 错误代码及描述 | 原因 |
---|---|---|
401 Unauthorized | UNAUTHORIZED | 访问本资源需要授权,未提供授权信息(Access Token) |
401 Unauthorized | INVALID_CREDENTIALS 无效的用户身份信息 | 用户名密码错误 |
401 Unauthorized | INVALID_ACCESS_TOKEN 无效的 Access Token | 系统无法识别本 Access Token |
401 Unauthorized | ACCESS_TOKEN_EXPIRED Access Token 过期 | Access Token 过期 |
403 Forbidden | NO_PRIVILEDGE 没有足够权限访问本资源 | 尽管调用者提供了有效的凭证(Access Token ),但没有被授予访问本资源的权限 |
#
输入验证错误输入验证基于两个方面的原因:保证业务功能合理性、保证系统安全。从业务的合理性来说,用户提交的参数都需要进行验证。如在业务层面可能要求密码必须大于 8 位且至少含有一个特殊字符等。
这里只描述保证业务功能合理性的部分,安全相关的部分将有相应的方案应对,不会有错误返回。
状态码 | 错误代码及描述 | 原因 |
---|---|---|
400 Bad Request | INVALID_REQUEST 无法解析请求中 JSON 数据 | 发送请求时请求体不符合标准的JSON格式,服务器无法正确解析 |
400 Bad Request | VALIDATION_FAILED 未通过输入参数校验 |
示例:创建学生未通过输入验证
#
其它标准错误状态码 | 错误代码及描述 | 原因 |
---|---|---|
404 Not Found | RESOURCE_NOT_FOUND 指定的资源不存在 | 请求的 URI 不正确或 URI 对应的资源不存在。 如:数据中没有和指定主键匹配的数据。 |
405 Method Not Allowed | METHOD_NOT_SUPPORTED 服务端没有实现请求的 HTTP 方法 | 服务不支持请求的 HTTP 方法 |
406 Not Acceptable | MEDIA_TYPE_NOT_ACCEPTABLE 服务端没有实现客户端可接受的媒体类型 | 服务端不能用客户端请求的媒体类型返回答应。 如客户端发送可接收 application/xml,服务端却只能生成 application/json 的应答 |
415 Unsupported Media Type | UNSUPPORTED_MEDIA_TYPE 服务端不支持请求中有效载荷的媒体类型 | 服务端不能处理请求中有效载荷的媒体类型。如客户端发送 application/xml 类型请求,服务端只接收 application/json 媒体类型 |
429 Unprocessable Entit | RATE_LIMIT_REACHED 到达API 限流值,阻塞请求 | 用户在规定的时间内的请求次数达到了API 请求的限流值。如某 API 设置为在 10 分钟内最多 100 次的 API 调用 |
500 Internal Server Error | INTERNAL_SERVER_ERROR 内部服务错误 | 服务端发生了非预期的错误,如空指针,数组越界等。 |
503 Service Unavailable | SERVICE_UNAVAILABLE 服务无效 | 因临时维护服务端不能处理请求 |
STALE_DATA_STATE
#
非标准错误非标准错误指的是业务异常,是业务逻辑的分支,这类错误只允许返回 400
。如 一个话题关闭以后就不可以再回复,如这时调用添加回复 API,系统返回 话题已关闭,不可回复
。
状态码 | 错误代码及描述 | 原因 |
---|---|---|
400 Bad Request | POST_CLOSED 话题已关闭,不可回复` | - |