Java springBoot 全局异常

创建一个全局异常类

// @RestControllerAdvice 注意这个注解 是当前异常类生效
@RestControllerAdvice
public class GlobalExceptionHandler {}

添加自定义异常捕获消息

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

	/**
	 * 全局异常.
	 *
	 * @param e the e
	 * @return R
	 */
	@ExceptionHandler(Exception.class)
	@ResponseBody
	public Resp exception(Exception e) {
		StackTraceElement  el = e.getStackTrace()[0];
		if (e.getCause() instanceof InvalidFormatException || e
				.getCause() instanceof MismatchedInputException) {
			//log.error("json数据序列化格式异常 ex={}", e.getMessage(), e);
			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("数字转换异常");
	}

	/**
	 * 业务异常.
	 *
	 * @param e the e
	 * @return Resp
	 */
	@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;
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dotclv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值