项目中全局异常处理

改造前:

public CodeMsg login(LoginVo loginVo) {
        if(loginVo==null){
            return CodeMsg.SERVER_ERROR;
        }
        String mobile=loginVo.getMobile();
        String formPassword=loginVo.getPassword();;
        //判断手机号是否存在
        User user=getById(Long.parseLong(mobile));
        if (user == null) {
            return CodeMsg.MOBILE_NOT_EXIST;
        }
        String dbPassword=user.getPassword();
        String salt=user.getSalt();
        String calcPassword=MD5Util.formPwdToDBPwd(formPassword,salt);
        if(!StringUtils.equals(dbPassword,calcPassword)){
            return CodeMsg.PASSWORD_ERROR;
        }
        return CodeMsg.SUCCESS;
    }

问题
业务代码逻辑不清晰,登录这种应用,返回成功或者失败即可。

修改后:

1.创建一个自定义异常GlobalException:
public class GlobalException extends RuntimeException {
    private CodeMsg cm;
    public GlobalException(CodeMsg cm){
        super(cm.toString());
        this.cm=cm;
    }

    public CodeMsg getCm() {
        return cm;
    }
}

2.对原有异常部分,直接抛出异常:

遇到异常情况,直接抛出。
 public boolean login(LoginVo loginVo) {
        if(loginVo==null){
            throw new GlobalException(CodeMsg.SERVER_ERROR);
        }
        String mobile=loginVo.getMobile();
        String formPassword=loginVo.getPassword();;
        //判断手机号是否存在
        User user=getById(Long.parseLong(mobile));
        if (user == null) {
            throw new GlobalException(CodeMsg.MOBILE_NOT_EXIST);
        }
        String dbPassword=user.getPassword();
        String salt=user.getSalt();
        String calcPassword=MD5Util.formPwdToDBPwd(formPassword,salt);
        if(!StringUtils.equals(dbPassword,calcPassword)){
            throw new GlobalException(CodeMsg.PASSWORD_ERROR);
        }
        return true;
    }
3.定义一个全局异常处理器

a.注解ControllerAdvice,以控制器作为切面,aop拦截异常
b.@ExceptionHandler(value = Exception.class)控制拦截的异常范围
c.针对不同的异常类型,做单独处理

@ControllerAdvice //控制器切面
@ResponseBody
public class GlobalExceptionHandler {
    @ExceptionHandler(value = Exception.class)//所有的异常都拦截
    public Result<String> exceptionHandler(HttpServletRequest request,Exception exception){
        if(exception instanceof GlobalException){
            GlobalException globalException=(GlobalException) exception;
            return Result.error(globalException.getCm());
        }else if(exception instanceof BindException){
            BindException bindException=(BindException) exception;
            List<ObjectError> errorList=bindException.getAllErrors();
            ObjectError error=errorList.get(0);
            String msg=error.getDefaultMessage();
            return Result.error(CodeMsg.BIND_EXCEPTION.fillArgs(msg));
        }else{
            return Result.error(CodeMsg.SERVER_ERROR);
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值