SpringMVC_异常统一处理

3.全局统一异常处理

3.1目前存在问题

  • 模拟后台出现服务器异常

    java 复制代码
    @GetMapping
        public ResultResp list(@RequestParam(required = false) String name){
            System.out.println(1/0);
            List<Item> ret = service.lists(name);
            return ResultResp.success(ret==null?Code.PAGE_FAIL:Code.PAGE_OK,ret);
        }
  • 出现如下错误

3.2后端服务可能会出现的异常

  • 框架可能报错

  • 持久层代码报错

  • 业务层业务代码报错

  • 控制层业务代码报错

  • 注意:这些异常不能避免的,此时应该把所有的异常在表现层进行统一的处理(aop)

  • 解决方案

    java 复制代码
    @RestControllerAdvice
    public class ExceptionHandlerController {
    
        @ExceptionHandler(ArithmeticException.class)
        public ResultResp handlerException(){
            System.out.println("出现异常了");
            return new ResultResp(500,null,"服务繁忙,请稍后再试");
        }
    }

3.3@RestControllerAdvice

  • 使用来做控制器增强操作

    名称 @RestControllerAdvice
    位置 Rest 风格增强类上
    作用 给控制器做增强操作
    使用 类上面
    • 包含了如下注解
      • @ResponseBody
      • @ControllerAdvice
      • @Component

3.4@ExceptionHandler

  • 异常处理器

    名称 @ExceptionHandler
    位置 方法上
    属性 具体的异常类型
    作用 处理具体异常的,设定具体异常类型,出现异常后,终止controller中方法的执行,转入当前方法执行

3.5项目中具体处理

  • 业务异常

    java 复制代码
    @Data
    public class BusinessException extends RuntimeException{
        private Integer code;
    }
  • 持久层异常

    java 复制代码
    @Data
    public class DaoException extends RuntimeException{
        private Integer code;
    }
  • 系统异常

    java 复制代码
    @Data
    public class SystemException extends RuntimeException{
        private Integer code;
    }
  • 其它异常

    java 复制代码
    @Data
    public class OtherException extends RuntimeException{
        private Integer code;
    }
  • 定义code

    java 复制代码
    public class Code {
        /**
         * 定义好协议之后,前端和后端统一按照协议执行
         */
        public static final Integer SAVE_OK = 20000;
        public static final Integer SAVE_FAIL = 20001;
    
    
        public static final Integer UPDATE_OK = 20010;
        public static final Integer UPDATE_FAIL = 20011;
    
        public static final Integer DELETE_OK = 20020;
        public static final Integer DELETE_FAIL = 20021;
    
        public static final Integer GET_OK = 20030;
        public static final Integer GET_FAIL = 20031;
    
        public static final Integer PAGE_OK = 20040;
        public static final Integer PAGE_FAIL = 20041;
    
        
        public static final Integer BUSINESS_ERR = 50001;
        public static final Integer SYSTEM_ERR = 50002;
        public static final Integer DAO_ERR = 50003;
        public static final Integer OTHER_ERR = 50005;
        
        
    
    }
  • 统一异常处理

    java 复制代码
    @RestControllerAdvice
    public class ExceptionHandlerController {
        //业务异常的例子:账户名和密码错误
        @ExceptionHandler(BusinessException.class)
        public ResultResp handlerBusinessException(BusinessException e){
            return new ResultResp(e.getCode(),null,e.getMessage());
        }
        
        //需要发送短信提醒运维人员
        @ExceptionHandler(SystemException.class)
        public ResultResp handlerSystemException(SystemException e){
            //发送短信提醒业务人员的操作
            //日志打印
            return new ResultResp(e.getCode(),null,e.getMessage());
        }
    
        @ExceptionHandler(OtherException.class)
        public ResultResp handlerException(OtherException e){
            return new ResultResp(e.getCode(),null,e.getMessage());
        }
    }
  • 控制层方法

    java 复制代码
     @GetMapping
    public ResultResp list(@RequestParam(required = false) String name) {
        if (name == null || name.equals(""))
            throw new BusinessException(Code.BUSINESS_ERR,"传参不正常请重试");
        List<Item> ret = null;
        try {
            ret = service.lists(name);
        } catch (Exception e) {
            throw new SystemException(Code.SYSTEM_ERR,"系统繁忙,请稍后再试");
        }
        return ResultResp.success(ret == null ? Code.PAGE_FAIL : Code.PAGE_OK, ret);
    }
相关推荐
李少兄1 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝1 小时前
【设计模式】原型模式
java·设计模式·原型模式
可乐加.糖1 小时前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
s9123601011 小时前
rust 同时处理多个异步任务
java·数据库·rust
9号达人1 小时前
java9新特性详解与实践
java·后端·面试
cg50171 小时前
Spring Boot 的配置文件
java·linux·spring boot
啊喜拔牙2 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
anlogic2 小时前
Java基础 4.3
java·开发语言
非ban必选3 小时前
spring-ai-alibaba第七章阿里dashscope集成RedisChatMemory实现对话记忆
java·后端·spring
A旧城以西3 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea