• springboot下添加全局异常处理和自定义异常处理


    前言

    在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。

    相关代码:

    GlobalExceptionHandler类:

    @Slf4j
    @RestControllerAdvice
    public class GlobalExceptionHandler {
    
        /********************************
         *  @function  : 自定义从捕捉
         *  @parameter : [e:CustomException | 自定义异常]
         *  @date      : 2023/12/5 11:47
         ********************************/
        @ExceptionHandler(value = CustomException.class)
        public AjaxResult customExceptionHandler(HttpServletRequest request, CustomException e) {
            log.error("业务异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e);
            return new AjaxResult(e.getCode() , e.getMessage(), null);
        }
    
        /********************************
         *  @function  : 空指针异常捕捉
         *  @parameter : [e:Exception | 异常]
         *  @date      : 2023/12/5 11:47
         ********************************/
        @ExceptionHandler(value = Exception.class)
        public AjaxResult exceptionHandler(HttpServletRequest request, Exception e) {
            log.error("服务器内部异常异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e);
            return new AjaxResult(500 , e.getMessage(), null);
        }
    
    }
    
    

    自定义异常CustomException类:

    @Slf4j
    @Data
    public class CustomException extends RuntimeException{
    
        //错误码
        private int code;
    
        //错误信息
        private String message;
    
    
        public CustomException() {
            super();
        }
    
        public CustomException(ResultCodeEnum resultCodeEnum) {
            super(String.valueOf(resultCodeEnum.getCode()));
            this.code = resultCodeEnum.getCode();
            this.message = resultCodeEnum.getMessage();
        }
    
    }
    

    通用返回类:AjaxResult

    @Data
    public class AjaxResult extends HashMap {
    
        // 状态码
        private static final String CODE_TAG = "code";
    
        // 返回消息
        private static final String MSG_TAG = "message";
    
        // 数据对象
        private static final String DATA_TAG = "data";
    
        public AjaxResult(int code, String message, Object data)
        {
            super.put(CODE_TAG, code);
            super.put(MSG_TAG, message);
            if (data != null)
            {
                super.put(DATA_TAG, data);
            }
        }
    
        /********************************
         *  @method    : success
         *  @function  : 返回成功消息(重载)
         *  @parameter :
         *  @return    : AjaxResult
         ********************************/
        public static AjaxResult success(){
            return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), null);
        }
    
        /********************************
         *  @method    : success
         *  @function  : 返回成功消息(重载)
         *  @parameter : message : String | 返回消息
         *  @return    : AjaxResult
         ********************************/
        public static AjaxResult success(String message){
            return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, null);
        }
    
        /********************************
         *  @method    : success
         *  @function  : 返回成功消息(重载)
         *  @parameter : data : Object | 数据对象
         *  @return    : AjaxResult
         ********************************/
        public static AjaxResult success(Object data){
            return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), data);
        }
    
        /********************************
         *  @method    : success
         *  @function  : 返回成功消息(重载)
         *  @parameter : message : String | 返回消息
         *  @parameter : data : Object | 数据对象
         *  @return    : AjaxResult
         ********************************/
        public static AjaxResult success(String message, Object data){
            return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, data);
        }
    
        /********************************
         *  @method    : failed
         *  @function  : 返回失败消息(重载)
         *  @parameter :
         *  @return    : AjaxResult
         ********************************/
        public static AjaxResult failed(){
            return new AjaxResult(ResultCodeEnum.FAILED.getCode(), ResultCodeEnum.FAILED.getMessage(), null);
        }
    
        /********************************
         *  @method    : failed
         *  @function  : 返回失败消息(重载)
         *  @parameter : message : String | 返回消息
         *  @return    : AjaxResult
         ********************************/
        public static AjaxResult failed(String message){
            return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, null);
        }
    
        /********************************
         *  @method    : failed
         *  @function  : 返回失败消息(重载)
         *  @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型
         *  @return    : AjaxResult
         ********************************/
        public static AjaxResult failed(ResultCodeEnum resultCodeEnum){
            return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), null);
        }
    
        /********************************
         *  @method    : failed
         *  @function  : 返回失败消息(重载)
         *  @parameter : message : String | 返回消息
         *  @parameter : data : Object | 数据对象
         *  @return    : AjaxResult
         ********************************/
        public static AjaxResult failed(String message, Object data){
            return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, data);
        }
    
        /********************************
         *  @method    : failed
         *  @function  : 返回失败消息(重载)
         *  @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型
         *  @parameter : data : Object | 数据对象
         *  @return    : AjaxResult
         ********************************/
        public static AjaxResult failed(ResultCodeEnum resultCodeEnum, Object data){
            return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), data);
        }
    }
    
    

    枚举类ResultCodeEnum:

    public enum ResultCodeEnum {
    
        // 10??? 通用
        SUCCESS(10000,"请求成功"),
        FAILED(10008, "请求失败"),
        FAILED_PARAM_ERROR(10009, "参数错误"),
    ...
        private Integer code;
    
        private String message;
    
        ResultCodeEnum(Integer code, String message) {
            this.code = code;
            this.message = message;
        }
    
        public int getCode(){
            return code;
        }
    
        public String getMessage(){
            return message;
        }
    
    }
    

    使用:

    在controller里面判断值是否异常,如果异常则直接抛出异常不进行执行,终止当前的流程,在service层也可以这样处理。

    
        public AjaxResult getUserInfo(@RequestParam(value = "userId") Integer userId) {
            if (userId == 0) {
                throw new CustomException(ResultCodeEnum.NOT_EXIST_USER_ERROR);
            }
            ...
        }
            
    

    再者是一些数值上的错误,比如除0,这种情况会被全局异常捕获,并返回相应的错误给到前端

    
        @GetMapping("/test")
        public AjaxResult test(){
            int i = 60/0;
            return AjaxResult.success();
        }
    
  • 相关阅读:
    微信小程序------框架
    一文让前端搞懂shell编程
    【爬虫+情感判定+Top10高频词+词云图】"王心凌"热门弹幕python舆情分析
    浅析即时通讯移动端开发DNS域名劫持等杂症
    Flawfinder的安装及使用
    SpringCloud相关理论概念集合
    MySQL库表操作
    VXLAN篇之进阶
    JAVA 实现《推箱子升级版》游戏
    LeetCode每日一题——813. 最大平均值和的分组
  • 原文地址:https://www.cnblogs.com/Johnyzh/p/17895032.html