2.4.5 异常处理
2.4.5.1 异常信息格式
系统在交互中难免会有异常发生,前端为了解析异常信息向用户提示定义了异常信息的返回格式,如下:
1、返回response状态说明
状态码 | 说明 |
---|---|
200 | 成功 |
401 | 没有权限 |
500 | 程序错误(需要自定义错误体) |
2、自定义错误体
{
"errCode": "000000", "errMessage": "错误说明"
}
2.4.5.2 异常处理流程
{
"timestamp": "20**20**‐**09**‐10T10:06:19.936 +0000",
"status": 500,
"error": "Internal Server Error",
"message": "验证码错误",
"path": "/merchant/merchants/register"
}
截至目前系统并没有按照前端要求返回异常信息,测试如下: 注册商户时输入一个错误的验证码,返回信息如下:
从上边的返回信息得知,状态码为500符合要求,按前端的规范定义的错误信息要写在“errMessage” 中,显然不符合要求。
系统规范了异常处理流程,如下:
1、在服务层抛出自定义异常类型及不可预知异常类型。
上图中BusinessException为系统的自定义异常类型,程序中在代码显示抛出该异常,此类异常是程序员可预知的。
另一部分是系统无法预知的异常,如:数据库无法连接,服务器宕机等场景下所抛出的异常,此类异常是程序员无 法预知的异常。
2、应用层接收到服务层抛出异常继续向上抛出,应用层自己也可以抛出自定义异常类型及不可预知异常类型。
3、统一异常处理器捕获到异常进行解析。
判断如果为自定义异常则直接取出错误代码及错误信息,因为程序员在抛出自定义异常时已将错误代码和异常信息指定。
如果为不可预知的异常则统一定义为99999异常代码。
{ “errCode”: “000000”, “errMessage”: “错误说明” }
4、统一异常处理器将异常信息格式为前端要求的格式响应给前端。服务端统一将异常信息封装在下边的Json格式中返回。
2.4.5.3 自定义业务异常类
1、在huiminpay-common工程的com.huiminpay.cache.common.domain包下添加业务异常编码
package com.huiminpay.common.cache.domain;
/**
* 异常编码 0成功、-1熔断、 -2 标准参数校验不通过 -3会话超时
* 前两位:服务标识
* 中间两位:模块标识
* 后两位:异常标识
*/
public enum CommonErrorCode implements ErrorCode {
公用异常编码 //
E_200201(200101,"传入对象为空"),
E_200202(200102,"参数为空"),
E_200203(200103,"手机号已存在"),
E_200204(200104,"租户为管理员,不可删除"),
E_200205(200105,"账号被其他租户使用,不可删除"),
E_200206(200106,"角色被使用中,不可删除"),
E_200207(200107,"查询结果为空"),
E_200208(200108,"账号不存在"),
E_200209(200109,"支付渠道参数不能为空"),
E_200210(200110,"应用未绑定平台渠道"),
E_200211(200111,"商户下未设置根门店"),
E_200212(200112,"商户应用支持的聚合平台支付渠道不能为空"),
E_200213(200113,"支付金额不能为空"),
E_200214(200114,"openId不能为空"),
E_200215(200115,"获取支付状态超时"),
E_200216(200116,"授权码为空"),
E_200217(200117,"订单标题为空"),
E_200218(200118,"订单金额为空"),
E_200219(200119,"订单金额格式有误"),
E_200220(200120,"授权码格式有误"),
E_200221(200121,"角色为空"),
E_200222