• 23.SpringCloud实战项目-整合统一异常处理


    简介

    • PassJava-Learning项目是PassJava(佳必过)项目的学习教程。对架构、业务、技术要点进行讲解。
    • PassJava 是一款Java面试刷题的开源系统,可以用零碎时间利用小程序查看常见面试题,夯实Java基础。
    • PassJava 项目可以教会你如何搭建SpringBoot项目,Spring Cloud项目
    • 采用流行的技术,如 SpringBoot、MyBatis、Redis、 MySql、 MongoDB、 RabbitMQ、Elasticsearch,采用Docker容器化部署。

    更好的阅读体验

    文档连载目录

    整合统一异常处理

    一、缘起

    我们在写代码的时候,通常会在方法里面添加各种try catch来捕获异常,会发现有很多重复的代码,所以我们可以整合统一异常处理来优化代码结构。

    拦截异常并统一处理我们可以用到@RestControllerAdvice注解

    二、自定义异常处理类

    • 添加统一异常处理类注解@RestControllerAdvice

    • 添加日志注解@Slf4j

    • 添加异常处理方法注解@ExceptionHandler

    package com.jackson0714.passjava.question.exception;
    
    /*
    * 集中处理所有异常
     */
    @Slf4j
    @RestControllerAdvice(basePackages = "com.jackson0714.passjava.question.controller")
    public class PassjavaExceptionControllerAdvice {
    
        @ResponseBody
        @ExceptionHandler(value= MethodArgumentNotValidException.class)
        public R handleValidException(MethodArgumentNotValidException e) {
            log.error("数据校验出现问题{},异常类型:{}", e.getMessage(), e.getClass());
            BindingResult bindingResult = e.getBindingResult();
            Map<String, String> errorMap = new HashMap<>();
            bindingResult.getFieldErrors().forEach((fieldError)->{
                errorMap.put(fieldError.getField(), fieldError.getDefaultMessage());
            });
    
            return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(), BizCodeEnum.VALID_EXCEPTION.getMsg()).put("data", errorMap);
        }
    
        @ExceptionHandler(value=Throwable.class)
        public R handleException(Throwable throwable) {
            log.error("未知异常{},异常类型:{}", throwable.getMessage(), throwable.getClass());
            
            return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());
        }
    }
    

    三、推荐的系统错误码

    1.错误码和错误信息定义类

    • 1.错误码长度:5个数字

    • 2.前两位:业务场景

    • 3.后三位:错误码

    10:通用业务
    	001:参数格式校验错误(10001)
    11:会员业务
    12:题目业务
    13:内容业务
    14:学习业务
    

    2.错误码枚举类

    com.jackson0714.common.exception.BizCodeEnum

    定义了两种异常枚举:系统未知异常、参数格式校验失败

    package com.jackson0714.common.exception;
    
    public enum BizCodeEnum {
        UNKNOWN_EXCEPTION(10000, "系统未知异常"),
        VALID_EXCEPTION(10001, "参数格式校验失败");
    
        private int code;
        private String msg;
        BizCodeEnum(int code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    
        public int getCode() {
            return code;
        }
    
        public String getMsg() {
            return msg;
        }
    }
    

    四、测试代码

    测试场景1:校验参数displayOrder必须为正整数,如果displayOrder不为正整数,则会抛出异常

    • 1.实体类上添加校验注解@Positive
    /**
     * 排序
     */
    @Positive
    private Integer displayOrder;
    
    • 2.controller类里面添加save方法,并添加校验参数注解@Valid
    /**
    * 保存
    */
    @RequestMapping("/save")
    public R save(@Valid @RequestBody QuestionEntity question){
        questionService.save(question);
    
        return R.ok();
    }
    

    测试:

    用Postman工具调用save方法

    请求地址:

    http://192.168.10.160:8060/api/question/v1/admin/question/save
    

    请求参数:

    {
        "displayOrder": 0.2
    }
    

    返回结果:

    {
        "msg": "参数格式校验失败",
        "code": 10001,
        "data": {
            "displayOrder": "必须是正数"
        }
    }
    

    测试场景2:对于代码里面直接抛出的异常,也可以handle

    1.controller类里面添加查询题目的方法,并抛出Exception异常

    /**
    * 信息
    */
    @RequestMapping("/info/{id}")
    //@RequiresPermissions("question:question:info")
    public R info(@PathVariable("id") Long id) throws Exception {
        QuestionEntity question = questionService.getById(id);
        throw new Exception("test");
    
        //return R.ok().put("question", question);
    }
    

    测试:

    用Postman工具调用save方法

    请求地址:

    http://192.168.10.160:8060/api/question/v1/admin/question/save
    

    返回结果:

    {
        "msg": "系统未知异常",
        "code": 10000
    }
    

    证明统一处理方法被调用了:

    @ExceptionHandler(value=Throwable.class)
    public R handleException(Throwable throwable) {
        return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());
    }
    

    代码地址

    https://github.com/Jackson0714/PassJava-Platform

    公众号

    公众号

  • 相关阅读:
    Lua中的closure、泛型for
    Lua多重继承
    (转)C++ new详解
    C++重载操作符学习
    Lua中使用继承来组装新的环境
    DOS:变量嵌套和命令嵌套
    C++中成员的私有性
    ManualResetEvent 类
    在IIS中部署和注册WCF服务
    ArcGIS Server 10 地图缓存新特性
  • 原文地址:https://www.cnblogs.com/jackson0714/p/12971156.html
Copyright © 2020-2023  润新知