说明
:通常是系统产生了未知的异常或者是由于其他底层服务出现状况导致后续无法处理的情况。如数据库连接异常、缓存连接异常、数据库SQL执行异常,程序产生Bug等
正例
:服务错误异常,针对于无法处理的异常业务需要转换成ServiceErrorException抛出
try {
// 业务代码
} catch (DataBaseIOExcpetion $ex) {
throw new ServiceErrorException(ErrorCode::DB_ERROR, $ex);
}
说明
:业务逻辑状态或应用的功能相关的异常,如用户不存在、排班已满、由于余额不足导致转账失败等
正例
:对于ServiceLogicException的抛出方式可分为两类,一种是自身要抛出的业务异常
// 业务代码
throw new ServiceLogicException(
AuthCode::INVALID_SCOPE_PARAMETER_MSG,
AuthCode::INVALID_SCOPE_PARAMETER);
另外一种是由于内部的一些异常导致的一些非错误的异常。
try {
// 业务代码
} catch (UrlEncodingExcpetion $ex) {
throw new ServiceLogicException(
CommonCode::URL_ENCODING_MSG,
CommonCode::URL_ENCODING,
$ex);
}
说明
:代码中校验各种入参时抛出的异常,ServiceValidException继承ServiceException
正例
:可以不传参数
// 业务代码
throw new ServiceValidException();
如果存在多个字段出错可以加入字段
$violationItems = [
Results::buildViolationItem("username", "用户名不能为空"),
Results::buildViolationItem("password", "密码不能为空")];
throw new ServiceValidException(
CommonCode::INVALID_ARGS_MSG,
CommonCode::INVALID_ARGS,
$violationItems);
还可以使用框架的Preconditions
类的checkArgument
方法来抛出ServiceValidException
public static function checkArgument(
bool $expression,
string $message = CommonCode::INVALID_ARGS_MSG,
string $errorCode = CommonCode::INVALID_ARGS,
array $violationItems = [])
{
if (!$expression) {
throw new ServiceValidException($message, $errorCode, $violationItems);
}
}
说明
:约定好的规范
说明
:约定好的规范
说明
:code为1约定好的规范,同时为避免和先前的code重复,所以采用"SYS_"打头
正例
:"SYS_1"、"SYS_2"、"SYS_3"
说明
:自己业务抛出的业务异常对应的code除开框架提供的公共的code外,只能使用自己的业务code。以保障code在全局的唯一性。
比如,用户的业务编号可以是"UC_1"、"UC_2"、"UC_3",其他业务不能直接抛出code为"UC_1"、"UC_2"、"UC_3"之类的异常。
说明
:"C_"、"AUTH_"、"SYS_"打头的由框架提供的团队进行维护,开发者可以给框架开发团队提需求进行完善
说明
:比如 UserCode、SignCode等
说明
:参照如下代码:
const INVALID_SCOPE_PARAMETER = "AUTH_0";
const INVALID_SCOPE_PARAMETER_MSG = "在请求中存在无效的scope参数";
const MISSING_SCOPE_PARAMETER = "AUTH_1";
const MISSING_SCOPE_PARAMETER_MSG = "在请求中scope参数丢失";
说明
:可以根据自身业务状况调整,如果业务对code有特殊含义和特殊的判断分支,可以自行定义当前的编号。
ServiceErrorException、ServiceLogicException、ServiceValidException这三个异常都包含了code属性,用于表示异常的错误编号
新的code规范都是采用了【业务简称】_【数字】
的方式来进行定义。【业务简称】
需要保障唯一性。
具体见下表:
code | 含义 | 对应异常 | 对应枚举类型 | 备注 |
---|---|---|---|---|
0 | 成功 | 无 | SuccessCode | |
1 | 未知异常 | ServiceErrorException | ErrorCode | 兼容老系统 |
SYS_数字 | 系统错误 | ServiceErrorException | ErrorCode | 新的系统错误编码规范都是SYS_数字 的组合方式,比如SYS_1 表示数据库异常 |
C_数字 | 通用业务异常 | ServiceLogicException | CommonCode | 通用的业务异常编码规范 |
C_1 | 校验异常 | ServiceValidException | CommonCode | 业务校验失败的编码 |
AUTH_数字 | OAuth验证的通用异常 | ServiceLogicException | AuthCode | |
业务简称_数字 | 各业务自定义的业务异常 | ServiceLogicException | 业务自己定义错误消息和错误号 |
上面 SuccessCode、ErrorCode、CommonCode、AuthCode 在wedoctor-convention包里面已经进行了定义,如果各业务上还需对上面的这几类异常号补充,请各位与我们进行联系。
项目中各自业务有各自的编码,大家可以通过定义自己的Code来做到。可以照搬CommonCode的写法,进行自己业务编码定义。