Spring Boot系列2-全局統一異常處理

原創: 猿份哥

原文鏈接:http://www.lskyf.com/view/9

爲什麼要全局統一異常處理呢?

如果系統發生了異常,不做統一異常處理,前端會給用戶展示一大片看不懂的文字。做統一異常處理後當異常發生後可以給用戶一個溫馨的提示,不至於使用戶滿頭霧水,所以一方面是爲了更好的用戶體驗 如果不統一全局異常,服務端和前端在遇到異常的時候處理起來雜亂無章非常費力。所以另一方面是爲了制定規範提高工作效率

SpringBoot如何實現全局統一異常處理呢?

項目目錄結構

 

自定義異常類

pom.xml加入lombok

<dependency>

       <groupId>org.projectlombok</groupId>

       <artifactId>lombok</artifactId>

</dependency>

MyException.java

@Getter

@Setter

public class MyException extends RuntimeException {

   private Integer code;

   public MyException(String msg){

       super(msg);

   }



   public MyException(Integer code,String msg){

       super(msg);

       this.code=code;

   }

}

自定義枚舉類

public enum ResultEnum {

   SUCCESS(200,"成功"),

   FAIL(100,"失敗"),

   EXCEPTION(300,"系統異常"),

   UNLOGIN(201,"未登錄");



   private Integer code;

   private String msg;



   private ResultEnum(Integer code,String msg){

       this.code=code;

       this.msg=msg;

   }



   public Integer getCode() {

       return code;

   }



   public void setCode(Integer code) {

       this.code = code;

   }



   public String getMsg() {

       return msg;

   }

自定義全局異常捕獲類

@ControllerAdvice

public class MyExceptionAdvice {



   @ExceptionHandler(value = Exception.class)

   @ResponseBody

   public Result defaultException(HttpServletRequest request,Exception e){

       e.printStackTrace();

       return Result.builder()

               .code(ResultEnum.EXCEPTION.getCode())

               .message(ResultEnum.EXCEPTION.getMsg())

               .build();

   }



   @ExceptionHandler(value = MyException.class)

   @ResponseBody

   public Result myException(HttpServletRequest request,MyException e){

       e.printStackTrace();

       Integer code=e.getCode();

       String message=e.getMessage();



       if (e.getCode()==null){

           code=ResultEnum.EXCEPTION.getCode();

       }

       if (e.getMessage()==null){

           message=ResultEnum.EXCEPTION.getMsg();

       }

       return Result.builder()

               .code(code)

               .message(message)

               .build();

   }

}

進行測試

@RestController

public class ExceptionController {

   @RequestMapping("/exception")

   public Result exception(String name,String pwd) throws Exception {

           String realname="tiankonglanlande";

           String realPwd="123";



           if(null!=name&&name.equals("xx")){

               throw new Exception("系統異常!");

           }

           if(StringUtils.isEmpty(name)||StringUtils.isEmpty(pwd)){

               throw new MyException("參數必須傳!");

           }else if (!name.equals(realname)||!pwd.equals(realPwd)){

               throw new MyException("用戶名或密碼不正確!");

           }else if (name.equals("aa")){

               throw new MyException(200,"用戶名存在!");

           }

           String info="你好["+name+"]!";

       return ResultUtils.success(info);

   }

   @RequestMapping("/unlogin")

   public Result unlogin() throws Exception {

       return ResultUtils.success(ResultEnum.UNLOGIN);

   }

   @RequestMapping("/success")

   public Result success() throws Exception {

       return ResultUtils.success(200,"自定義消息");

   }

}

運行測試在瀏覽器訪問

可以看到瀏覽器返回對應的json字符

源碼地址:

 https://github.com/tiankonglanlande/springboot

作        者:猿份哥
網址導航:http://www.lskyf.com
個人博客:http://www.lskyf.xyz
版權所有,歡迎保留原文鏈接進行轉載:) 關注我們的公衆號瞭解更多

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章