最近做了异常码统一专项,下面简单总结下经验,以来方便后面回顾。
异常码
每个项目对于异常码都有自己的定义和约定,但基本上errorCode和errorMsg都是必须的,二者可以建立字典关系,方便进行检索
后端通知前端异常的方式
- 返回统一对象Result;(往往是校验失败或被try-catch等)
- 直接throw出来的异常Exception(最好做全局的异常处理)。
返回统一对象Result
一般用在Controller层,是后端处理后的异常
如:
{
"flag": "1", // 0 成功 1 失败
"desc": "Error",
"data": "云表单创建失败"
}
直接throw出来的异常Exception
可以用于service层甚至dao层直接抛出到前端的异常
最好做全局异常处理,避免直接把Exception堆栈返回到前端,通过@ControllerAdvice和@ExceptionHandler进行切面处理
@ControllerAdvice
public class UpesnRestExceptionHandler {
public UpesnRestExceptionHandler() {
}
@ExceptionHandler({IllegalArgumentException.class})
@ResponseBody
public ResponseEntity<?> handleIllegalArgException(HttpServletRequest request, IllegalArgumentException exception) {
EcBaseException ecBaseException = EcBaseException.builder().code(ECErrorCode.COMMON_EXCEPTION_ERROR).displayCode("999-999-000001").message(EcBaseException.ILLEGAL_ARG_MESSAGE).detailMsg(exception.getMessage()).cause(exception.getCause()).build();
return new ResponseEntity(ecBaseException, HttpStatus.OK);
}
@ExceptionHandler({NullPointerException.class})
@ResponseBody
public ResponseEntity<?> handleNullPointerException(HttpServletRequest request, NullPointerException exception) {
EcBaseException ecBaseException = EcBaseException.builder().code(ECErrorCode.COMMON_EXCEPTION_ERROR).displayCode("999-999-000002").message(EcBaseException.NULL_POINTER_MESSAGE).detailMsg(exception.getMessage()).cause(exception.getCause()).build();
return new ResponseEntity(ecBaseException, HttpStatus.OK);
}
}
在项目中异常码修改时,写的前后端对接wiki
目前后端返回前端异常的两种方式:
- 直接抛异常
- 返回jsonResult
直接抛异常
修改前:
{
"requestId": "45258b735c604522",
"code": 40401,
"message": "记录不存在",
"displayMessage": {
"zh_CN": "参数错误",
"zh_TW": "參數錯誤",
"en_US": "Parameter Invalid."
}
}
修改后:
需要向用户显示displayCode和message
{
"code":xxx,
"displayCode":"120-230-100006",//状态码
"message":"xxx", //异常摘要
"detailMsg":"xxx", //异常详情
"level":0, //异常级别 0错误(默认),1警告
"traceId":"sd00034129", // 链路ID
"uploadable":0 //是否可上报 0否(默认),1是
}
返回jsonResult
修改前:
{
"flag": "1", // 0 成功 1 失败
"desc": "Error",
"data": "云表单创建失败"
}
修改后:
flag=0:依旧展示data数据
flag=1:需要向用户显示displayCode和message
{
"flag": "1",// 0 成功 1 失败
"desc": "Error",
"data": "云表单创建失败",
"displayCode":"120-230-100006",//状态码
"message":"xxx", //异常摘要
"detailMsg":"xxx", //异常详情
"level":0, //异常级别 0错误(默认),1警告
"traceId":"sd00034129", // 链路ID
"uploadable":0 //是否可上报 0否(默认),1是
}
后端修改方案
直接抛异常:
改为抛出二方包异常EcBaseException。
返回jsonResult:
jsonResult增加参数displayCode和message
维护枚举类
用于维护displayCode和message关系