在我們做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.檢驗自定義異常
總結:測試得出,異常都可以統一處理了