在开发时,有大量的异常需要我们处理,我们会写大量的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下的全局异常处理类就会对这个异常进行处理。
暂时先写到这里,后续在再内容进行更新修改。