创建一个全局异常类
@RestControllerAdvice
public class GlobalExceptionHandler {}
添加自定义异常捕获消息
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Resp exception(Exception e) {
StackTraceElement el = e.getStackTrace()[0];
if (e.getCause() instanceof InvalidFormatException || e
.getCause() instanceof MismatchedInputException) {
LogUtil.error(el.getClassName(),el.getMethodName(),"json数据序列化格式异常",e);
return Resp.failed("json数据序列化格式异常,请检查参数类型。");
} else if (e.getMessage().contains("Duplicate entry")) {
LogUtil.error(el.getClassName(),el.getMethodName(),"保存唯一索引异常信息",e);
return Resp.failed("数据库唯一索引异常");
}else if (e.getMessage().contains("Data too long for column")) {
LogUtil.error(el.getClassName(),el.getMethodName(),"字段数据太长",e);
return Resp.failed("字段数据太长,写入数据库失败");
}else if (e.getCause() instanceof SQLException) {
LogUtil.error(el.getClassName(),el.getMethodName(),"sql异常",e);
return Resp.failed("sql数据库异常");
} else {
LogUtil.error(el.getClassName(),el.getMethodName(),e.getMessage(),e);
return Resp.failed(e.getMessage());
}
}
@ExceptionHandler(NullPointerException.class)
@ResponseBody
public Resp<String> numberFormatException(NullPointerException e) {
StackTraceElement el = e.getStackTrace()[0];
LogUtil.error(el.getClassName(),el.getMethodName(),"空指针异常",e);
return Resp.failed("空指针异常");
}
@ExceptionHandler(NumberFormatException.class)
@ResponseBody
public Resp<String> numberFormatException(NumberFormatException e) {
StackTraceElement el = e.getStackTrace()[0];
LogUtil.error(el.getClassName(),el.getMethodName(),"数字类型转换异常",e);
return Resp.failed("数字转换异常");
}
@ExceptionHandler(BusinessException.class)
@ResponseBody
public Resp<String> businessException(BusinessException e) {
StackTraceElement el = e.getStackTrace()[0];
LogUtil.error(el.getClassName(),el.getMethodName(),e.getMessage(),e);
if (e.getCode() != -100) {
return Resp.failed(e.getErrorEnum());
}
return Resp.failed(e.getMessage());
}
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Resp<String> methodArgumentNotValidHandler(MethodArgumentNotValidException e) {
List<FieldError> list = e.getBindingResult().getFieldErrors();
String msg = executeValidException(e, list);
StackTraceElement el = e.getStackTrace()[0];
LogUtil.error(el.getClassName(),el.getMethodName(),msg,e);
return Resp.failed(CodeRs.PARAM_ERROR.getCode(),msg);
}
@ExceptionHandler(value = BindException.class)
public Resp<String> methodArgumentNotValidHandler(BindException e) {
List<FieldError> list = e.getBindingResult().getFieldErrors();
String msg = executeValidException(e, list);
StackTraceElement el = e.getStackTrace()[0];
LogUtil.error(el.getClassName(),el.getMethodName(),msg,e);
return Resp.failed(CodeRs.PARAM_ERROR.getCode(),msg);
}
private String executeValidException(Exception e, List<FieldError> list) {
StringBuilder sb = new StringBuilder();
for (FieldError error : list) {
sb.append("字段").append(error.getField()).append(",").append(error.getDefaultMessage())
.append(";");
}
return"参数验证失败:" + sb.toString();
}
}
定义异常抛出类
public class BusinessException extends RuntimeException {
@Getter
private int code = -100;
@Getter
private CodeRs errorEnum;
public BusinessException(CodeRs codeRs) {
super(codeRs.getName());
this.code = codeRs.getCode();
this.errorEnum = codeRs;
}
public BusinessException(String msg) {
super(msg);
}
}
定义Code返回值枚举
public enum CodeRs {
SUCCESS(1,"SUCCESS"),
FAIL(-1,"FAIL"),
SYSTEM_ERROR(-1000,"SYSTEM_ERROR"),
PARAM_ERROR(-3,"PARAM_ERROR"),
UPLOAD_FILE_FAIL(-4,"UPLOAD_FILE_FAIL"),
DCIS_PARAM_ERROR(-5,"DCIS_PARAM_ERROR"),
PERINFO_NOT_EXIST(-6,"PERINFO_NOT_EXIST"),
PERFILE_NOT_EXIST(-7,"PERFILE_NOT_EXIST"),
MERDEV_NOT_EXIST(-8,"MERDEV_NOT_EXIST"),
QRCODE_GENERATE_FAIL(-9,"QRCODE_GENERATE_FAIL"),
ORDER_NOT_EXIST(-10,"ORDER_NOT_EXIST"),
PAYTYPE_NOT_EXIST(-11,"PAYTYPE_NOT_EXIST"),
;
@Getter
private int code;
@Getter
private String name;
CodeRs(int code,String name) {
this.code = code;
this.name= name;
}
}
代码中使用
public Boolean xxxx(Long id) {
xxxxx c = xxx.selectById(id);
if (c == null) {
throw new BusinessException("xxxx不存在");
}
return true;
}