SpringMVC 全局異常統一處理


SpringMVC 異常統一處理的三種方式:

  1. 使用@ExceptionHandler 注解
  2. 實現 HandlerExceptionResolver 接口
  3. 使用 @ControllerAdvice注解

總結:

  當以下三個方式,一起出現時,只執行范圍最小的方式,后面的方式不再執行處理;

  執行范圍:@ExceptionHandler < @ControllerAdvice + @E..Handler < HandlerExceptionResolver

  人話:當某個Mapping發生異常后,先有@ExceptionHandler處理;如果沒有上者,則由@ControllerAdvice + @E..Handle 處理;如果沒有上者,則由HandlerExceptionResolver 處理

  •  使用@ExceptionHandler注解
    • 作用域:局部,針對一個Controller中的指定異常類:
    • 注有該注解的方法,和發生異常的Mapping方法,兩者需要在同一個Controller里面;
       1 @RestController
       2 public class TestExceptionController {
       3 
       4     @RequestMapping("/testEx01")
       5     public Map testEx01(){
       6         Map codeMap = new HashMap();
       7         int i = 9/0;
       8         codeMap.put("code",200);
       9         codeMap.put("msg","ok");
      10         return codeMap;
      11     }
      12     // @ExceptionHandler 參數為 要處理器的 異常類(或子類)
      13     @ExceptionHandler(ArithmeticException.class)
      14     public Map exInfo(ArithmeticException e){
      15         Map codeMap = new HashMap();
      16         System.out.println(e.getMessage());
      17         codeMap.put("code",700);
      18         codeMap.put("msg","分母不能為0");
      19         return codeMap;
      20     }
      21 
      22 }
  • 使用HandlerExceptionResolver 接口(前后端分離項目不使用)
    • 作用域:全局,針對全部Controller,無需指定某個異常類;
    • HandlerExceptionResolver 接口中,只有resolveException 一個方法,實現即可;
       1 //作用域:全局,針對全部Controller,無需指定某個異常類
       2 @Component
       3 public class HandlerEx implements HandlerExceptionResolver {
       4     @Override
       5     public ModelAndView resolveException(HttpServletRequest httpServletRequest,
       6                                          HttpServletResponse httpServletResponse, Object o, Exception e) {
       7         System.out.println(e.getMessage());
       8         ModelAndView mv = new ModelAndView();
       9         mv.setViewName("/systemException");
      10         return mv;
      11     }
      12 }
  • 使用 @ControllerAdvice 注解(可以用於前后端分離項目,經常使用的)
    • 作用域:全局,針對全部 Controller 中的指定異常類;
    • 該注解需要 和 @ExceptionHandler 配合,來完成全局異常的處理;
    • 注意:兩個注解的配合,發生異常 Mapping 方法 與 @ExceptionHandler 注解的方法,就可以不用卸載用一個Controller 里;
       1 //統一 異常的通知
       2 @RestControllerAdvice   //restController 的通知
       3 public class ZDYExceptionAdvice {
       4 
       5     @ExceptionHandler(Exception.class)
       6     public Map showInfoE(Exception e){
       7         System.out.println(" 統一異常 ");
       8         System.out.println(e.getMessage());
       9 
      10         Map codeMap = new HashMap();
      11         codeMap.put("code",800);
      12         codeMap.put("msg","系統繁忙!!");
      13         return codeMap;
      14     }
      15 
      16     // @ExceptionHandler 參數為 要處理器的 異常類(或子類)
      17     // 注解參數不聲明指定異常類,則默認為方法列表中的異常參數類
      18     @ExceptionHandler(ArithmeticException.class)
      19     public Map showInfo(Exception e){
      20         System.out.println(" 算數異常 ");
      21         System.out.println(e.getMessage());
      22 
      23         Map codeMap = new HashMap();
      24         codeMap.put("code",800);
      25         codeMap.put("msg","你不能把分母設置為0");
      26         return codeMap;
      27     }
      28 
      29     //自定義 異常
      30     @ExceptionHandler(ZDYException.class)
      31     public Map zdyException(ZDYException e){
      32         System.out.println(e.getMsg());
      33 
      34         Map codeMap = new HashMap();
      35         codeMap.put("code",e.getCode());
      36         codeMap.put("msg",e.getMsg());
      37         return codeMap;
      38     }
      39 }

      自定義異常:

       1 //測試 自定義異常
       2     @RequestMapping("/testEx03")
       3     public Map zdyEx(int x,int y){
       4         Map codeMap = new HashMap();
       5         if (y == 0) {
       6             throw new ZDYException(1111,"自定義異常");
       7         }
       8         int i = x/y;
       9         codeMap.put("code",200);
      10         codeMap.put("msg","ok");
      11         codeMap.put("data",i);
      12         return codeMap;
      13     }

      需要繼承 RuntimeException:

       1 //自定義異常
       2 public class ZDYException extends RuntimeException{
       3     private int code;
       4     private String msg;
       5 
       6     public ZDYException() {
       7     }
       8 
       9     public ZDYException(int code, String msg) {
      10         this.code = code;
      11         this.msg = msg;
      12     }
      13 
      14     public int getCode() {
      15         return code;
      16     }
      17 
      18     public void setCode(int code) {
      19         this.code = code;
      20     }
      21 
      22     public String getMsg() {
      23         return msg;
      24     }
      25 
      26     public void setMsg(String msg) {
      27         this.msg = msg;
      28     }
      29 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM