SpringMVC 全局異常統一處理


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

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

總結

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

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

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

  • 使用 @ExceptionHandler 注解

作用域:局部,針對一個Controller中的指定異常類;

注有該注解的方法,和發生異常的Mapping方法,兩者需要在同一個Controller里;

@Controller
@ResponseBody
public class Cors {
    @RequestMapping("/cors")
    public String reqShow(HttpServletRequest request){
        // 發生 ArithmeticException 異常
        int i = 1/0;
        // 是否是 Ajax 請求
        return "XMLHttpRequest".
            equalsIgnoreCase(request.getHeader("X-Requested-With"));
    }
	// @ExceptionHandler 參數為 要處理器的 異常類(或子類)
    @ExceptionHandler(ArithmeticException.class)
    public String exInfo(ArithmeticException e){
        System.out.println(e.getMessage());
        return "seccess";
    }
}
  • 實現 HandlerExceptionResolver 接口

作用域:全局,針對全部Controller,無需指定某個異常類;

HandlerExceptionResolver 接口 中 只有 resolveException 一個方法,實現即可;

@Component
public class HandlerEx implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest,
                                         HttpServletResponse httpServletResponse, Object o, Exception e) {
        System.out.println(e.getMessage());
        return null;
    }
}
  • 使用 @ControllerAdvice 注解

作用域:全局,針對全部Controller中的指定異常類;

該注解需要 和@ExceptionHandler配合,來完成全局異常的處理;

注意:兩個注解的配合,發生異常Mapping方法 與 @ExceptionHandler注解的方法 就可以不用寫在同一個Controller 里;

@Controller
@ResponseBody
public class Cors {
    @RequestMapping("/cors")
    public String reqShow(){
        // 發生 ArithmeticException 異常 
        int i = 1/0;
        return "hello";
    }
}

@ControllerAdvice
public class AppAllException{
    @ResponseStatus(HttpStatus.BAD_REQUEST)	// 響應 狀態碼400
    // @ExceptionHandler 參數為 要處理器的 異常類(或子類) 
    // 注解參數不聲明指定異常類,則默認為方法列表中的異常參數類
    @ExceptionHandler(ArithmeticException.class)
    public void showInfo(Exception e){
        System.out.println(e.getMessage());
    }
}

此時,依然堅持寫在同一個Controler里的話,未嘗不可。不改變的是:作用域仍是全局的;例子如下

@Controller
@ControllerAdvice
public class ShiroAllException {
    @RequestMapping("/cors")
    public String reqShow(){
        int i = 1/0;
        return "hello";
    }
    
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ArithmeticException.class)
    public void showInfo(Exception e){
        System.out.println(e.getMessage());
    }
}


免責聲明!

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



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