工作小技巧,封装if和Exception

在我们的工作中,经常会有这样的逻辑,就是判断一个参数是否合法,不合法就抛出异常,再由全局异常捕获后返回。

本文使用我编写的springboot日记本系统作为蓝本,,在已有项目的基础上改,源码下载地址和教程在文末。

比如controller中有这样一个注册方法:

@RequestMapping("register")
public Result register(@RequestBody User user){
    if(StrUtil.isEmpty(user.getUserName())){
        throw new BizException(ExceptionCodeEnum.ERROR_PARAM.setDesc("用户名不允许为空!"));
    }
    if(StrUtil.isEmpty(user.getPassword())){
        throw new BizException(ExceptionCodeEnum.ERROR_PARAM.setDesc("密码不允许为空!"));
    }
    //检查用户名是否重复
    if(userService.getByUserName(user.getUserName()) != null){
        throw new BizException(ExceptionCodeEnum.ERROR_PARAM.setDesc("用户名"+user.getUserName()+"重复!"));
    }
    //拼装userBean
    user.setUid(redisServiceImpl.getIncr("userId")); //redis自增ID
    user.setPassword(SecureUtil.md5(user.getPassword() + salt));
    user.setCreateTime(DateUtil.now());
    user.setUpdateTime(DateUtil.now());
    userService.save(user);
    return Result.success();
}

重点就是这个:

if(StrUtil.isEmpty(user.getUserName())){
   throw new BizException(ExceptionCodeEnum.ERROR_PARAM.setDesc("用户名不允许为空!"));
}

我们习惯先用if判断一个参数的合法性,如果不合法就抛出异常。

这样做自然没有问题,但是如果这样的判断很多,代码就会变得臃肿。

怎么简化呢?

我们可以从之前的逆向思维改为正向思维,就是所谓的断言

比如这个逻辑是当检测到用户名为空,就抛出异常。那我们可以把这个逻辑改成:我要求这个用户名必须非空,否则就抛出异常。

让我们编写一个校验类和方法。

/**
 * 通用校验工具类
 */
@Slf4j
public class VerifyBusinessUtil {

    /**
     * 断言
     * @param judge
     * @param error
     */
    public static void checkArguments(boolean judge,String error){
        if(!judge){
            log.error("{}", error);
            throw new BizException(ExceptionCodeEnum.ERROR_PARAM,error);
        }
    }

}

这段代码是一个通用校验工具类,其中包含了一个名为checkArguments的方法,该方法接收两个参数:一个boolean类型的判断条件judge和一个String类型的错误信息error。

在方法内部,首先使用Slf4j注解定义了一个log对象,用于记录错误信息。然后,如果judge为false,即判断条件不成立,就会抛出一个BizException异常,并将错误信息error和异常码ExceptionCodeEnum.ERROR_PARAM一起传入异常中。

该方法主要用于校验输入参数是否合法,如果不合法则会抛出异常并打印错误信息。

然后可以改写之前的if语句

@RequestMapping("register")
public Result register(@RequestBody User user){
    VerifyBusinessUtil.checkArguments(!StrUtil.isEmpty(user.getUserName()),"用户名不允许为空!");
    VerifyBusinessUtil.checkArguments(!StrUtil.isEmpty(user.getPassword()),"密码不允许为空!");
    VerifyBusinessUtil.checkArguments(userService.getByUserName(user.getUserName()) == null,"用户名"+user.getUserName()+"重复!");
   
    //拼装userBean
    user.setUid(redisServiceImpl.getIncr("userId")); //redis自增ID
    user.setPassword(SecureUtil.md5(user.getPassword() + salt));
    user.setCreateTime(DateUtil.now());
    user.setUpdateTime(DateUtil.now());
    userService.save(user);
    return Result.success();
}

是不是清爽了许多呢?

哈哈,这就是大部分企业里面都会封装的一个方法,很好用,也确实有它的道理。

如果你是第一次见到这种写法,那么就赶紧用起来吧!~

源码下载

这个案例我是在 springboot日记本系统 里面完成了,有需要源码的小伙伴直接clone这个项目即可。

https://gitee.com/skyblue0678/diary

猜你喜欢

转载自blog.csdn.net/weixin_39570751/article/details/131085595