我們在寫接口時,會出現一些不可避免的小錯誤,但是每個地方都拋出一個異常又有點耗時耗費精力,還比較繁瑣,所以我們可以定義一個全局的異常捕獲,來告知請求端
import com.qiqi.utils.ExceptionUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.TypeMismatchException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 全局異常捕獲處理
*/
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* http請求的方法不正確
*/
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
@ResponseBody
public String httpRequestMethodNotSupportedExceptionHandler(HttpRequestMethodNotSupportedException e) {
logger.error("http請求的方法不正確:【"+e.getMessage()+"】");
return ExceptionUtil.resultOf(ResultStatusCode.RequestMethodNotAllowed);
}
/**
* 請求參數不全
*/
@ExceptionHandler(MissingServletRequestParameterException.class)
@ResponseBody
public String missingServletRequestParameterExceptionHandler(MissingServletRequestParameterException e) {
logger.error("請求參數不全:【"+e.getMessage()+"】");
return ExceptionUtil.resultOf(ResultStatusCode.MissingServletRequestParameter);
}
/**
* 請求參數類型不正確
*/
@ExceptionHandler(TypeMismatchException.class)
@ResponseBody
public String typeMismatchExceptionHandler(TypeMismatchException e) {
logger.error("請求參數類型不正確:【"+e.getMessage()+"】");
return ExceptionUtil.resultOf(ResultStatusCode.TypeMismatchException);
}
/**
* 數據格式不正確
*/
@ExceptionHandler(DataFormatException.class)
@ResponseBody
public String dataFormatExceptionHandler(DataFormatException e) {
logger.error("數據格式不正確:【"+e.getMessage()+"】");
return ExceptionUtil.resultOf(ResultStatusCode.DataFormatException);
}
/**
* 非法輸入
*/
@ExceptionHandler(IllegalArgumentException.class)
@ResponseBody
public String illegalArgumentExceptionHandler(IllegalArgumentException e) {
logger.error("非法輸入:【"+e.getMessage()+"】");
return ExceptionUtil.resultOf(ResultStatusCode.IllegalArgumentException);
}
@ExceptionHandler //處理其他異常
@ResponseBody
public String allExceptionHandler(Exception e){
logger.error("具體錯誤信息:【"+ExceptionUtil.getErrorMessage(e)+"】"); //會記錄出錯的代碼行等具體信息
int count = 0; //只打印15行的錯誤堆棧
for (StackTraceElement stackTraceElement : e.getStackTrace()) {
logger.error(stackTraceElement.toString());
if(count++ > 13) break;
}
return ExceptionUtil.resultOf(ResultStatusCode.SystemException);
}
}
有問題請聯繫