springboot統一處理異常和自定義異常

在我們做web系統的時候,難免會出現各種各樣的異常,但是這種異常,不能直接顯示在客戶端,所以我們服務端就需要做統一處理,統一返回格式給客戶端

這裏用到了spring的兩個註解:@ControllerAdvice---控制器增強和@ExceptionHandler ---異常處理

下面來看看具體的實現,建立一個類,加上@ControllerAdvice註解


/**
 * 統一異常處理類
 */
@ControllerAdvice
public class MyExceptionHandler {

    private static Logger logger = LoggerFactory.getLogger(MyExceptionHandler.class);

    /**
     * 參數解析失敗異常處理
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(HttpMessageNotReadableException.class)
    @ResponseBody
    public ResponseResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e, HttpServletRequest request) {
        logger.error(request.getRequestURI() + ":參數解析失敗",e);
        return new ResponseResult(HttpStatus.BAD_REQUEST.value(),"參數解析失敗");
    }

    /**
     * 不支持當前請求方法異常處理
     */
    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    @ResponseBody
    public ResponseResult handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e, HttpServletRequest request) {
        logger.error(request.getRequestURI() + ":不支持當前請求方法",e);
        return new ResponseResult(HttpStatus.METHOD_NOT_ALLOWED.value(),"不支持當前請求方法");
    }


    /**
     * 項目運行異常處理
     */
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseResult handleException(Exception e, HttpServletRequest request) {
        logger.error(request.getRequestURI() + ":服務運行異常",e);
        return new ResponseResult(HttpStatus.INTERNAL_SERVER_ERROR.value(),"服務運行異常");

    }


    /**
     * 自定義異常處理
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(MyException.class)
    @ResponseBody
    public ResponseResult handleException(MyException e, HttpServletRequest request) {
        logger.error(request.getRequestURI() + ":自定義內部異常",e.getMsg());
        return new ResponseResult(e.getCode(),e.getMsg());

    }
}

這裏只是舉例經常遇到的幾個異常,具體的項目運行異常還可以細分,如空指針、類型轉換異常、IO異常等

最後一個就是自定義異常處理

@Data
public class MyException extends RuntimeException{

    //錯誤嗎
    private Integer code;

    //錯誤信息
    private String msg;

    public MyException(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    

}

下面來檢驗一下,統一處理異常是否生效

1.檢驗請求類型,我們用get請求方式去測試

2.檢驗服務器運行異常,我們故意在代碼中寫個異常來測試(應該拋出java.lang.ArithmeticException: / by zero)

3.檢驗自定義異常

總結:測試得出,異常都可以統一處理了

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