Spring能够较好的处理这种问题,核心如下,文章主要关注前两个:
- @ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度
- @ControllerAdvice:异常集中处理,更好的使业务逻辑与异常处理剥离开
- @ResponseStatus:可以将某种异常映射为HTTP状态码
1、先定义一个ControllerAdvice。代码如下
package com.zycfc.zsf.boot.exception.handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import com.zycfc.zsf.boot.exception.ExceptionInfo;
import com.zycfc.zsf.boot.exception.type.ExceptionCode;
import com.zycfc.zsf.boot.util.json.JsonUtils;
import lombok.extern.slf4j.Slf4j;
/**
* 全局异常捕获
*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
private final ZsfExceptionHandler handler;
public GlobalExceptionHandler(ZsfExceptionHandler handler) {
this.handler = handler;
}
@ExceptionHandler(Throwable.class)指定拦截异常的类型
public void handleException(HttpServletRequest request, HttpServletResponse response, Throwable ex) {
try {
log.error("全局异常拦截处理", ex);
ExceptionInfo res = handler.resolveException(ex);
handler.sendErrorMsg(request, response, res);
} catch (Throwable e) {
log.error("GlobalExceptionHandler---" + e.getMessage(), e);
log.error("GlobalExceptionHandler====" + ex.getMessage(), ex);
}
}
@ExceptionHandler(value = MethodArgumentNotValidException.