(四)Springboot入門之全局異常捕獲

原文地址:http://te-amo.site/user/article/info/ARTICLE20180223085118171

寫在前面的

在項目開發中異常是不可避免的問題,所以在項目中異常捕獲統一處理對一個應用來說顯得比較重要,對於開發人員來說便於找到錯誤的原因,對於用戶來說在出錯時也可以得到服務器的及時響應有較好的體驗。

一、邏輯業務處理前異常捕獲

這種異常大多是資源請求的錯誤,例如錯誤的url地址所引起的404異常。
處理這種異常需要實現ErrorController接口,代碼如下:

@Controller
public class ResourceExceptionHandler implements ErrorController {
    private static Logger logger = Logger.getLogger(ResourceExceptionHandler.class.getName());
    @Override
    public String getErrorPath() {
        return "/error";
    }
    /**
    *處理需要返回和html頁面的異常
    **/
    @RequestMapping(value = "/error",produces = "text/html")
    public ModelAndView errorHtml(HttpServletResponse resp, HttpServletRequest req) {
        logger.info("page not found");
        return new ModelAndView("404.html");
    }
    /**
    *處理需要返回JSON數據的異常
    **/
    @RequestMapping(value = "/error")
    @ResponseBody
    public Object error(HttpServletResponse resp, HttpServletRequest req) {
        logger.info("ResponseBody not found");
        return "ResourceExceptionHandler ResponseBody";
    }
}

二、執行@RequestMapping時異常捕獲

這種異常主要包括參數的不匹配,參數轉換等異常
處理這種異常使用@ControllerAdvice和繼承ResponseEntityExceptionHandler示例代碼如下:

@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {


    /**
     * 參數不足異常
     * 這裏只列舉了一個方法
     * 如果需要處理其他的異常可以查看ResponseEntityExceptionHandler的源碼,可以重寫你需要的異常處理方法
     */
    @Override
    protected ResponseEntity<Object> handleMissingServletRequestParameter(MissingServletRequestParameterException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {

        return new ResponseEntity<Object>(ex.getMessage(), status);
    }
}

三、邏輯業務處理中異常捕獲

邏輯業務處理中的異常,主要是指在處理業務邏輯時可能會發生各種問題,如空指針,數據庫錯誤等。

(1)使用Html模板渲染的應用

這種應用異常處理,需要實現HandlerExceptionResolver接口

@Component
public class ModelAndViewExceptionHandler implements HandlerExceptionResolver {
    private static Logger logger = Logger.getLogger(ModelAndViewExceptionHandler.class.getName());
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        logger.info("ModelAndView 異常");
        return new ModelAndView("error.html");
    }
}
(2)restful風格應用

處理此種應用的異常使用@ControllerAdvice和@ExceptionHandler註解

@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {


    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Object exceptionHandler(HttpServletRequest request, Exception e) throws Exception {
        logger.info("異常處理邏輯");
        return "error";
    }
}
發佈了32 篇原創文章 · 獲贊 2 · 訪問量 4674
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章