优雅的定义全局异常处理方式

        在开发时,有大量的异常需要我们处理,我们会写大量的try catch代码块,代码一长看着就很就很难受,就像一些常用的方法,我们可以把他抽取出来单独的去搞一个方法,需要使用的时候就直接调用,增强代码可读性还可以减少代码的冗余。那么如何处理呢?

注解@ControllerAdvice

大致内容如下图:

        可以看到其实处理异常的是@ExceptionHandler,具体的匹配规则可以看上图。我们往往会自己定义一个类,加上@ControllerAdvice注解。这个类就相当于我们自定义的全局异常处理器,我们可以根据不同的业务场景定义自己需要的异常处理方法,比如在进入controller之前出现了http请求参数格式异常。进入service层的统一处理的业务异常,mybatis数据库异常,以及数据完整性约束等异常方法等。这块看不懂往下看,介绍一下断言Assert

断言Assert

@Test
    public void test1() {
        ...
        User user = userDao.selectById(userId);
        Assert.notNull(user, "用户不存在.");
        ...
    }
 
    @Test
    public void test2() {
        // 另一种写法
        User user = userDao.selectById(userId);
        if (user == null) {
            throw new IllegalArgumentException("用户不存在.");
        }
    }

Assert.notNull源码:

 public static void notNull(Object object, String message) {
        if (object == null) {
            throw new IllegalArgumentException(message);
        }
    }

        可以看到其实Assert已经帮我们把if else进行了封装。

        当然抛出异常的时候也可以直接自定义一个类似于Assert的类,比如定义一个Asserts

定义Asserts抛出异常

public class Asserts {
    public static void runFail(String message) {
        throw new ApiException(message);
    }

在该类中定义一些抛出异常的方法,比如我这里的runFail(),这些异常的方法最好自己自定义一个Exception类。

public class ApiException extends RuntimeException {
    private IErrorCode errorCode;

    public ApiException(String message) {
        super(message);
    }
}

        在这里我定义了一个ApiException并继承了RuntimeException,然后再在ApiException类中自己定义我的自定义异常一个通用返回对处理方式。对接口的处理创建象,里面内容为

    private long code;
    private String message;
    private T data;

         也就是每一次前端发起一个请求的时候,调用我们的接口,我们给它返回的统一处理对象。

里面当然也有一些统一返回结果的构造方法和成功失败后message和data的相应返回结果。定义一个枚举类去枚举code和message

    /**
     * 获取所有用户信息
     * @return
     */
    @Override
    public List<Admin> getAdminList() {
        List<Admin> AdminList = AdminMapper.selectList(null);
        if (umsAdminList.isEmpty()) {
            Asserts.runFail("用户列表为空");
        }
        return AdminList;
    }

         进行异常抛出的时候直接使用Asserts.runFail("用户列表为空")抛出,这个时候@ControllerAdvice下的全局异常处理类就会对这个异常进行处理。

        暂时先写到这里,后续在再内容进行更新修改。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

那山川

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

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

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

打赏作者

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

抵扣说明:

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

余额充值