全局异常处理

真实场景:校验号码是否已经被注册,假如号码已经被注册
分析步骤:
1、判断号码是否被注册,被注册,走第二步
2、抛出异常
3、全局异常类捕获异常
4、返回处理结果


必知:
1、工具类:AssertUtil 、ResultInfoUtil(ResultInfo 的工具类)
2、ResultInfo —— vo类


service层

   //校验手机号是否已注册
	public void checkPhoneIsRegistered(String phone){
		//校验号码是否为空
		AssertUtil.isNotEmpty(phone, "手机号不能为空");
		//号码与数据库数据比对
		Dinner dinner = dinersMapper.checkPhoneIsRegistered(phone);
		//重复
		AssertUtil.isTrue(dinner, "号码未注册")
	}

工具类

public class AssertUtil {

    // 判断字符串非空
    public static void isNotEmpty(String str, String... message) {
        if (StrUtil.isBlank(str)) {
            execute(message);
        }
    }

    // 判断结果是否为真
    public static void isTrue(boolean isTrue, String... message) {
        if (isTrue) {
            execute(message);
        }
    }

    // 最终执行方法  --执行到这里说明由异常
    private static void execute(String... message) {
        String msg = ApiConstant.ERROR_MESSAGE;
        //判断有无错误提示信息、有的话,就代替默认错误提示信息
        if (message != null && message.length > 0) {
            msg = message[0];
        }
        //抛出异常 —— 让全局异常类捕获该异常
        throw new ParameterException(msg);//具体异常类,这里是参数异常类
    }

}



/**
 * 公共返回对象工具类
 */
public class ResultInfoUtil {

    // 请求出错返回
    public static <T> ResultInfo<T> buildError(int errorCode, String message) {
        ResultInfo<T> resultInfo = build(errorCode, message, null);
        return resultInfo;
    }

    // 构建返回对象方法
    public static <T> ResultInfo<T> build(Integer code, String message, T data) {
        if (code == null) {
            code = ApiConstant.SUCCESS_CODE;
        }
        if (message == null) {
            message = ApiConstant.SUCCESS_MESSAGE;
        }
        ResultInfo resultInfo = new ResultInfo();
        resultInfo.setCode(code);
        resultInfo.setMessage(message);
        resultInfo.setData(data);
        return resultInfo;
    }

}

全局异常捕获类

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

	//具体异常
    @ExceptionHandler(ParameterException.class)
	public ResultInfo<Map<String, String>> handlerParameterException(ParameterException ex){
	      //其实这里可以直接返回 resultInfo 信息,但是这里是全局异常处理类,按照单一责任原则,所以不建议在这返回 resultInfo 信息。
		  ResultInfo<Map<String, String>> resultInfo =
                ResultInfoUtil.buildError(ex.getErrorCode(), ex.getMessage());
		  return resultInfo;
	 }
	
	// 未知异常 —— 最大异常
	@ExceptionHandler(Exception.class)
	public  ResultInfo<Map<String, String>> handlerException(Exception e){
		//返回结果
	}
}

参数异常类

/**
 * 全局异常类 —— 参数异常
 */
@Getter
@Setter
public class ParameterException extends RuntimeException {

    private Integer errorCode;

    public ParameterException() {
        super(ApiConstant.ERROR_MESSAGE);
        this.errorCode = ApiConstant.ERROR_CODE;
    }

    public ParameterException(Integer errorCode) {
        this.errorCode = errorCode;
    }

    public ParameterException(String message) {
        super(message);
        this.errorCode = ApiConstant.ERROR_CODE;
    }

    public ParameterException(Integer errorCode, String message) {
        super(message);
        this.errorCode = errorCode;
    }

}

ResultInfo 对象

/**
 * 公共返回对象
 */
@Getter
@Setter
@ApiModel(value = "返回说明")
public class ResultInfo<T> implements Serializable {
    
    @ApiModelProperty(value = "成功标识0=失败,1=成功")
    private Integer code;
    @ApiModelProperty(value = "描述信息")
    private String message;
    @ApiModelProperty(value = "访问路径")
    private String path;
    @ApiModelProperty(value = "返回数据对象")
    private T data;
    
}```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值