240814-异常码

74 阅读2分钟

最近做了异常码统一专项,下面简单总结下经验,以来方便后面回顾。

异常码

每个项目对于异常码都有自己的定义和约定,但基本上errorCode和errorMsg都是必须的,二者可以建立字典关系,方便进行检索

后端通知前端异常的方式

  1. 返回统一对象Result;(往往是校验失败或被try-catch等)
  2. 直接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

目前后端返回前端异常的两种方式:

  1. 直接抛异常
  2. 返回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关系