前言
上一章我们说了全局的aop日志处理和追踪UUID日志打印。这一节讲的是全局的异常捕获。代码中再也不需要填入无数的try catch这种无效代码来进行异常捕获,去抛出,返回对应的Spring mvc结果。都可以通过这节的代码来解决
参考博客:https://www.cnblogs.com/xuwujing/p/10933082.html
代码
BaseException 自定义异常
public class BaseException extends RuntimeException {
private static final long serialVersionUID = -4939515770813597146L;
/**
* 所属模块
*/
private String module;
/**
* 错误码
*/
private String code;
/**
* 错误码对应的参数
*/
private Object args;
/**
* 错误消息
*/
private String message;
public BaseException(){}
public BaseException(String code, String message) {
this.code = code;
this.message = message;
}
public BaseException(String module, String code, String message) {
this.module = module;
this.code = code;
this.message = message;
}
public BaseException(String module, String code, Object args, String message) {
this.module = module;
this.code = code;
this.args = args;
this.message = message;
}
public String getModule() {
return module;
}
public String getCode() {
return code;
}
public Object getArgs() {
return args;
}
@Override
public String getMessage() {
return message;
}
}
Sprin mvc通用返回类。
public class ResultReturn<T> {
private String code;
private String msg;
private T data;
public ResultReturn() {
}
public ResultReturn(String code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public ResultReturn(String code, String msg) {
this.code = code;
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public static <T> ResultReturn<T> createResult(ResultReturnEnum resultReturnEnum, T data) {
return new ResultReturn(resultReturnEnum.getCode(), resultReturnEnum.getMessage(), data);
}
public static <T> ResultReturn<T> createResult(String code, String message, T data) {
return new ResultReturn(code, message, data);
}
public static <T> ResultReturn<T> success() {
return createResult(ResultReturnEnum.SUCCESS, null);
}
public static <T> ResultReturn<T> success(T data) {
return createResult(ResultReturnEnum.SUCCESS, data);
}
public static <T> ResultReturn<T> error() {
return createResult(ResultReturnEnum.ERROR, null);
}
public static <T> ResultReturn<T> customError(ResultReturnEnum resultReturnEnum) {
return createResult(resultReturnEnum, null);
}
public static <T> ResultReturn<T> customError(String code, String message) {
return createResult(code, message, null);
}
public static <T> ResultReturn<T> customError(ResultReturnEnum resultReturnEnum, T data) {
return createResult(resultReturnEnum, data);
}
public static <T> ResultReturn<T> customError(String code, String message, T data) {
return createResult(code, message, data);
}
}
ResultReturnEnum返回异常的枚举类
public enum ResultReturnEnum {
SUCCESS("200","成功"),
ERROR("500","系统异常"),
;
private String code;
private String message;
ResultReturnEnum(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public String getMessage() {
return message;
}
}
Spring mvc全局异常处理,只针对@controller注解下的类
import com.chen.common.exception.BaseException;
import com.chen.common.result.ResultReturn;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
@Slf4j
@ResponseBody
public class WebExceptionHandler {
/**
* 处理自定义的业务异常
* HandlerMethod method这个参数可以获得一些方法的额外信息
*
* @param e
* @return
*/
@ExceptionHandler(value = BaseException.class)
public ResultReturn bizExceptionHandler(BaseException e) {
log.info("basic error,module:{},errorCode:{},errorMessage:{}", e.getModule(), e.getCode(), e.getMessage());
return ResultReturn.customError(e.getCode(), e.getMessage());
}
/**
* 处理其他异常
*
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResultReturn exceptionHandler(Exception e) {
log.info("wow,unknow erroro happen", e);
return ResultReturn.error();
}
}
说明
这样我们的springmvc全局异常类就好了。我们会把全局的异常分别归类为已知异常和未知异常。当发生已知异常时,直接记录异常日志即可,当发生未知异常,需要不仅仅记录异常日志,还要打印对应的堆栈信息。
然后我们的WebExceptionHandler类会捕获这些发生的异常,然后在http请求后直接返回我们需要返回的json形式的返回值。
但是还是有一个缺点。就是mq这种不是http的请求的日志捕获还是的自己进行
结尾
github:https://github.com/alex9567/SpringCloudScaffold