1. 程式人生 > 其它 >統一異常返回 帶統一返回訊息列舉類CodeEnum

統一異常返回 帶統一返回訊息列舉類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);

統一列舉類返回資訊:

 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;
   }
}