1. 程式人生 > >Spring MVC異常統一處理的三種方式

Spring MVC異常統一處理的三種方式

 

Spring 統一異常處理有 3 種方式,分別為:

  1. 使用 @ ExceptionHandler 註解
  2. 實現 HandlerExceptionResolver 介面
  3. 使用 @controlleradvice 註解

HandlerExceptionResolver,返回的是modelAndView。

@ControllerAdvice只是標註當前bean是對Controller增強,具體是增強什麼,則是配合@ExceptionHandler對異常進行精確處理。
HandlerExceptionResolver則可以進行全域性的異常控制,因此,所有的controller發生的異常都會進入其實現類,我們需要做通用處理。
檢視原始碼,可以發現HandlerExceptionResolver介面的抽象類AbstractHandlerMethodExceptionResolver和其子類ExceptionHandlerExceptionResolver一起組成使用@ExceptionHandler註釋的方法進行異常解析的功能。
現在基本都使用@

[email protected]註解來實現全域性的異常捕獲。

在執行@RequestMapping方法時發生的異常

這也是最常見的異常了,處理業務邏輯時可能會發生各種問題,如資料庫報錯、請求引數格式錯誤/缺失/值非法等。此類異常的捕獲方法有兩種,對於提供RESTful服務的應用,使用@ControllerAdvice@ExceptionHandler註解; 對於使用模板渲染HTML的應用,實現HandlerExceptionResolver介面。

在執行@RequestMapping之前遇到的異常

該類異常通常是因為SpringMVC沒有找到能處理當前請求的控制器造成的,比如最常見的404。此時@ControllerAdvice

就不起作用了,因為@RequestMapping方法根本沒找到,更不可能執行

此時我們要寫一個@RestController,並實現ErrorController介面:

@RestController
public class FinalExceptionHandler implements ErrorController {

    @RequestMapping(value = "/error", produces = Const.MIME.JSON)
    public MatrixResponse error(HttpServletResponse resp, HttpServletRequest req) {
        // 錯誤處理邏輯

        return new MatrixResponse(ErrorCode.INTERNAL_ERROR);
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}