统一异常返回 带统一返回消息枚举类CodeEnum

减少try {} catch {} 的代码块,

定义一个:

public class GlobalException extends RuntimeException {

   private Integer rsCode;

   public GlobalException(ErrCodeEnum errCodeEnum) {
       super(errCodeEnum.getMsg());
       this.rsCode = errCodeEnum.getRsCode();
   }

   public GlobalException(ErrCodeEnum errCodeEnum, String msg) {
       super(errCodeEnum.getMsg() + "--" + msg);
       this.rsCode = errCodeEnum.getRsCode();
   }

   public Integer getRsCode() {
       return rsCode;
   }

   public void setRsCode(Integer rsCode) {
       this.rsCode = rsCode;
   }
}

异常处理器:

 /**
  * 文件大小超过限制异常捕获
  * @author sailorj
  * @date 2021年11月30日 16:21
  */
 @RestControllerAdvice(annotations = {Controller.class, RestController.class})
 public class GlobalExceptionHandler {
     private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

   /**
    * 统一异常优点:
    * 高度统一所有异常返回的code及message, 如果需要更改提示信息或代号,只需更改 ErrCodeEnum 即可
    * 并且可以自行添加多个异常枚举文件来分别对应不同的模板异常信息。代码结构简单,清淅
    * @date 2022/3/14 22:30
    */

   /**
    * 设定的tomcat接收文件大小异常抛出
    */
   @ExceptionHandler(MultipartException.class)
   public DataPackage<JSONObject> uploadExcepttion(MultipartException e){
       DataPackage<JSONObject> dataPackage = new DataPackage<>();
       dataPackage.setRsCode(ErrCodeEnum.FAILED.getRsCode());
       dataPackage.setMsg(ErrCodeEnum.FAILED.getMsg() + ",上传失败,文件限制大小:50MB");
       log.error("文件接收大小限制的相关异常 -> {}", dataPackage.toString());
       return dataPackage;
   }

   /**
    * 自定义的异常
    */
   @ExceptionHandler(value = GlobalException.class)
   public DataPackage<JSONObject> globalExceptionHandler(GlobalException e) {
       DataPackage<JSONObject> dataPackage = new DataPackage<>();
       dataPackage.setRsCode(e.getRsCode());
       dataPackage.setMsg(e.getMessage());
       log.error("自定义的相关异常 -> {}, {}", dataPackage.toString(), getStackTraceByPh(e, "com.sailorj"));
       return dataPackage;
   }

   /**
    * 运行时异常
    */
   @ExceptionHandler(value = RuntimeException.class)
   public DataPackage<JSONObject> runtimeExceptionHandler(RuntimeException e) {
       DataPackage<JSONObject> dataPackage = new DataPackage<>();
       dataPackage.setRsCode(ErrCodeEnum.FAILED.getRsCode());
       dataPackage.setMsg(ErrCodeEnum.FAILED.getMsg() + ",运行时异常:" + e.getMessage());
       log.error("运行时的相关异常 -> {}, {}", dataPackage.toString(), getStackTraceByPh(e, "com.sailorj"));
       return dataPackage;
   }



   /**
    * 获取以指定包名为前缀的堆栈信息
    *
    * @date 2022/3/14 22:46
    * @param e                 异常
    * @param packagePrefix     包前缀
    * @return                  堆栈信息
    */
   public static String getStackTraceByPh(Throwable e, String packagePrefix) {
       StringBuilder s = new StringBuilder("\n").append(e);
       for (StackTraceElement traceElement : e.getStackTrace()) {
           if (!traceElement.getClassName().startsWith(packagePrefix)) {
               continue;
           }
           s.append("\n\tat ").append(traceElement);
       }
       return s.toString();
   }

}

在业务的地方直接使用,参数带入枚举信息:

 throw new GlobalException(ErrCodeEnum.ERRFILEURLNULL);

 // 也可后面带上接口信息
 throw new GlobalException(ErrCodeEnum.ERRFILEINFONULL, fileName);

如何设计API返回码(错误码)

统一枚举类返回信息:

 public enum ErrCodeEnum {
   // 接口成功返回
   SUCCESS(0, "success"),
   // 接口异常返回
   FAILED(1, "接口处理失败"),
      private Integer rsCode;
   private String msg;

   ErrCodeEnum(Integer rsCode, String msg) {
   	this.rsCode = rsCode;
   	this.msg = msg;
   }
}
posted @ 2022-03-17 10:50  sailorj  阅读(275)  评论(0)    收藏  举报