1. 程式人生 > >springboot統一異常處理方法

springboot統一異常處理方法

@ControllerAdvice註解將作用在所有註解了@RequestMapping的控制器的方法上
@ExceptionHandler:用於全域性處理控制器裡的異常

所以在寫專案的時候都service層和mapper層都使用拋異常的方式,把異常都拋到controller層,然後來統一處理.這個類其實就相當於一個controller,也能重定向,轉發頁面.

這個是統一異常處理類, @ControllerAdvice這個註解宣告的表示統一異常處理,@ExceptionHandler(value = Exception.class)這個註解寫在方法上表示,該方法處理哪個異常.

package com.buba.exceptionController;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
//捕捉工程所有異常
@ControllerAdvice
public class GloableExceptionController {
    //攔截Exception型別異常
    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultExceptionHandler(HttpServletRequest request,Exception ex){
        ModelAndView modelAndView = new ModelAndView("defaultException");
        //獲取請求路徑
        modelAndView.addObject("url",request.getRequestURL());
        //異常物件
        modelAndView.addObject("ex",ex);
        //異常物件資訊
        modelAndView.addObject("message",ex.getMessage());
        return modelAndView;
    }

    @ExceptionHandler(value = ArrayIndexOutOfBoundsException.class)
    public ModelAndView defaultExceptionHandler2(HttpServletRequest request,Exception ex){
        ModelAndView modelAndView = new ModelAndView("defaultException2");
        //獲取請求路徑
        modelAndView.addObject("url",request.getRequestURL());
        //異常物件
        modelAndView.addObject("ex",ex);
        //異常物件資訊
        modelAndView.addObject("message",ex.getMessage());
        return modelAndView;
    }
} 

這是兩個異常頁面,進行測試 

我controller寫了兩個異常方法,第一個是ArrayIndexOutOfBoundsException這個異常,第二個是NullPointerException

當訪問第二個異常的時候,因為在異常處理類中沒有精確指明有空指標異常,所以會找它的父類,exception,所以出來的是第一個異常頁面

當訪問第一個異常的時候,因為在異常處理類中有明確指定的這個異常,所以返回的是第二個頁面

總結: 也就是說這個異常處理類中,可以獲取所有的異常都拿excepion來接收,也可以明確指定哪個異常,跟上下順序無關,有明確指定的異常會找明確指定的,沒有就找父類.