Controller(控制层)、service业务逻辑层、dao持久层都会有异常,
我们遇到异常的方法都是向上抛出throw new RuntimeException(“xxxxx”);
抛给的就是你的调用方,dao抛给service,service抛给controller,controller再抛就抛给springmvc框架了;
如果不抛,直接捕获,你肯定不能所有的controller接口都写try catch,就会出现代码比较冗余;
所以应该把一个异常处理的逻辑代码统一在一个地方来写;
方案--@ControllerAdvice:
我们让它通通往上抛,抛给框架,由框架统一来处理,框架提供了一种机制,
即可以通过aop机制把控制层增强,就是通过@ControllerAdvice注解写一个增强类,
这个增强类就是把我们遇到的异常捕获;
方案--@ExceptionHandler
它的作用是来进行异常处理
这两注释结合就可以统一的来处理系统中的异常;
结论:
Controller(控制层)、service业务逻辑层、dao持久层往上抛异常,最后controller抛给框架了,
这时由增强类来捕获异常来处理,要怎么处理是由你来决定的,所以这个增强类由你来写;
框架给你提供的就是上面这两个注解;它的原理就是面向切面aop编程;
就不用每个controller上try catch,代码冗余;
实现:
1 对异常信息进行规范
异常抛出去后,必须给前端用户有个提示出来;所以前后端约定一下,如果遇到异常在errMessage属性上展示出来;
即ExResponseMessage.java 作用就是和前端约定返回的异常信息模型
2 自定义自已的异常类型
ExCustomType.java 继承 RuntimeException异常,里面有我们的一些自定义属性errMessage,还要要重写父类的一些方法:
为了将来方便我们throw new 抛出异常,定义了个静态方法cast,和一个cast的重载方法;
使用:
if (StringUtils.isBlank(dto.getName())) {
//throw new RuntimeException("名称为空");
//现在这里就改成抛出我们的异常了
ImsBootException.cast("名称为空");
}
这个看下代码写法即可: //有些信息是自已的用这个方法 public static void cast(String message){ //这个异常类型其它就是我们的异常类型 ,上面是这个的用法 throw new ExCustomType(message); } //有些信息是统一的如对象为空、非法参数等,用这个方法, 用法? public static void cast(ExMessageEnums error){ throw new ExCustomType(error.getErrMessage()); } |
3 编写异常处理器 GlobalExceptionHandler.java