springboot全局捕獲異常處理

助手類 @RestControllerAdvice
 RestControllerAdvice指向所有帶有註解@RestController的控制器
@ExceptionHandler(value = Exception.class)//對exception進行捕獲

通常會有web和ajax異常

思路:@RestControllerAdvice  捕獲異常 進行判斷是web異常還是ajax異常 分別作出判斷並處理

工具類 用來判斷是不是ajax請求

public class AjaxJudge {
    public static boolean isAjax(HttpServletRequest request){
        return  request.getHeader("X-Requested-With")!=null&& "XMLHttpRequest".equals( request.getHeader("X-Requested-With").toString());
    }
}

 異常處理助手類

/**
 * @ControllerAdvice和@RestControllerAdvice都可以指向控制器的一個子集
 * RestControllerAdvice指向所有帶有註解@RestController的控制器
 * ControllerAdvice指向所有指定包中的控制器
 * */
@RestControllerAdvice//表明這是一個助手類 表明拋出異常的時候會被這個類捕獲
@Component
public class ExceptionHanderler {

    public static final String ERRORPAGE_VIEW = "error";

    @ExceptionHandler(value = Exception.class)//對exception進行捕獲
    public Object errorHanderler(HttpServletRequest request, HttpServletResponse response,
                                 Exception e) throws Exception {
        //log.....................
        e.printStackTrace();//這裏就將異常信息簡單打印一下 不記錄日誌了
        if (AjaxJudge.isAjax(request)) {//判斷是不是ajax請求
            //這裏一般會做統一json處理 狀態處理等 主要返回頁面的友好信息處理結果或狀態碼的處理結果
            //404  500  501  502  503  自定義等
            return e.getMessage();
        } else {
            //非ajax請求 做modelandview處理返回
            ModelAndView model = new ModelAndView();
            model.addObject("exception", e);//異常信息
            model.addObject("url", request.getRequestURI());//發生錯誤異常的地址
            model.setViewName(ERRORPAGE_VIEW);//前端做的錯誤頁面或自己定義的頁面返回去
            return model;
        }
    }
}

請求

@RestController
@RequestMapping("/err")
public class HanderlerController {
    @GetMapping("/error")
    public String error() {
        return "handerler/error";
    }

    @GetMapping("/ajaxError")
    public String ajaxError() {
        return "handerler/ajaxError";
    }
}

js就不寫了 一般就是加載時啓動異步ajax向後臺發送請求

基本思路就是 判斷是ajax異步請求時異常還是web異常分別處理

 

 

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