• 统一异常处理


    1.什么是统一异常处理

    想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理

    2.统一异常处理

    2.1、创建统一异常处理器

    创建统一异常处理类GlobalExceptionHandler.java:

    /**
     * 描述:统一异常处理类
     */
    @ControllerAdvice
    @Slf4j
    public class GlobalExceptionHandler {
    
    
        @ExceptionHandler(Exception.class)//指定异常
        @ResponseBody  
        public R error(Exception e){
            e.printStackTrace();
            return R.error().message("执行了全局异常处理");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在请求里面制造异常

    int a = 10/0;
    
    • 1

    返回结果
    在这里插入图片描述

    2.2 处理特定异常

    GlobalExceptionHandler.java中添加异常处理方法

        //特定异常
        @ExceptionHandler(ArithmeticException.class)
        @ResponseBody 
        public R error(ArithmeticException e) {
            e.printStackTrace();
            return R.error().message("执行了ArithmeticException异常处理..");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.3 自定义异常

    2.3.1、创建自定义异常类

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    public class SelfDefinedException extends RuntimeException{
    
        @ApiModelProperty(value = "状态码")
        private Integer code;
    
        private String message;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.3.2、业务中需要的位置抛出SelfDefinedException

    try {
        int a = 10/0;
    }catch(Exception e) {
        throw new SelfDefinedException(20001,"出现自定义异常");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.3.3添加异常处理方法

    GlobalExceptionHandler.java中添加

        // 自定义异常
        @ExceptionHandler(SelfDefinedException.class)//指定异常
        @ResponseBody  
        public R error(SelfDefinedException e){
            log.error(ExceptionUtil.getMessage(e));
            e.printStackTrace();
            return R.error().message(e.getMessage()).code(e.getCode());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.3.4、测试

    在这里插入图片描述

    3.小结

    异常处理类GlobalExceptionHandler.java完整代码:

    /**
     * 描述:统一异常处理类
     */
    @ControllerAdvice
    @Slf4j
    public class GlobalExceptionHandler {
    
    
        @ExceptionHandler(Exception.class)//指定异常
        @ResponseBody  //返回格式
        public R error(Exception e){
            e.printStackTrace();
            return R.error().message("执行了全局异常处理");
        }
    
        //特定异常
        @ExceptionHandler(ArithmeticException.class)
        @ResponseBody //为了返回数据
        public R error(ArithmeticException e) {
            e.printStackTrace();
            return R.error().message("执行了ArithmeticException异常处理..");
        }
    
        // 自定义异常
        @ExceptionHandler(SelfDefinedException.class)//指定异常
        @ResponseBody  //返回格式
        public R error(SelfDefinedException e){
            e.printStackTrace();
            return R.error().message(e.getMessage()).code(e.getCode());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    给页面的统一的返回结果对象

    @Data
    public class R {
        @ApiModelProperty(value = "是否成功")
        private Boolean success;
    
        @ApiModelProperty(value = "返回码")
        private Integer code;
    
        @ApiModelProperty(value = "返回消息")
        private String message;
    
        @ApiModelProperty(value = "返回数据")
        private Map<String,Object> data = new HashMap<>();
    
        private R(){}
    
        public static R ok(){
            R r = new R();
            r.setSuccess(true);
            r.setCode(ResultCode.SUCCESS);
            r.setMessage("成功");
            return r;
        }
    
        public static R error(){
            R r = new R();
            r.setSuccess(true);
            r.setCode(ResultCode.ERROR);
            r.setMessage("失败");
            return r;
        }
    
        public R success(Boolean success){
            this.setSuccess(success);
            return  this;
        }
    
        public R message(String message){
            this.message = message;
            return this;
        }
    
        public R code(Integer code){
            this.setCode(code);
            return this;
        }
    
        public R data(String key,Object value){
            this.data.put(key,value);
            return this;
        }
    
        public R data(Map<String,Object> map){
            this.setData(map);
            return this;
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    总的来说自定义异常分为以下三步:
    第一步 创建自定义异常类继承RuntimeException并写异常属性
    第二步 在统一异常类添加规则
    第三步 执行自定义异常

    自定义异常在项目用的比较多,方便更好的和前端交互,从而达到更好的效果,应该在项目中规范起来!

  • 相关阅读:
    【JavaEE进阶】Spring统一功能处理:拦截器的使用
    ubuntu20.04中编译zlib1.2.11(源码编译)
    vscode中提升效率的插件扩展——待更新
    UML/SysML建模工具更新情况-截至2024年4月(1)5款-Trufun建模平台 v2024
    win10&11安装MG-SOFT+MIB+Browser+v10b
    选择商品属性弹框从底部弹出动画效果
    桂理理工大题
    c++day5
    echarts 中国地图效果,并附上小旗子
    Spring高手之路16——解析XML配置映射为BeanDefinition的源码
  • 原文地址:https://blog.csdn.net/LM_ZM0309/article/details/127457662