SpringBoot自定义异常全局捕获

SpringBoot自定义异常并全局捕获

  1. 前言 :不会写Bug的程序员不是一个好程序员, 不出异常的程序不是好程序,我们要做的就是抓住它,然后接着写Bug

处理流程

  1. 创建自定义异常类

     /**
     * 基础异常
     */
    public class BaseException extends RuntimeException {
        private static final long serialVersionUID = 1L;
    
        /**
         * 所属模块
         */
        private String module;
    
        /**
         * 错误码
         */
        private String code;
    
        /**
         * 错误码对应的参数
         */
        private Object[] args;
    
        /**
         * 错误消息
         */
        private String defaultMessage;
    
        public BaseException(String module, String code, Object[] args, String defaultMessage) {
            this.module = module;
            this.code = code;
            this.args = args;
            this.defaultMessage = defaultMessage;
        }
    
        public BaseException(String module, String code, Object[] args) {
            this(module, code, args, null);
        }
    
        public BaseException(String module, String defaultMessage) {
            this(module, null, null, defaultMessage);
        }
    
        public BaseException(String code, Object[] args) {
            this(null, code, args, null);
        }
    
        public BaseException(String defaultMessage) {
            this(null, null, null, defaultMessage);
        }
    
        public String getModule() {
            return module;
        }
    
        public String getCode() {
            return code;
        }
    
        public Object[] getArgs() {
            return args;
        }
    
        public String getDefaultMessage() {
            return defaultMessage;
        }
    }
    
    
  2. 创建具体模块的异常类

    /**
     * 用户信息异常类
     */
    public class FileException extends BaseException {
        private static final long serialVersionUID = 1L;
    
        public UserException(String code, Object[] args) {
            super("file", code, args, null);
        }
    }
    
  3. 对异常类型再做细分

    /**
     * 文件名称超长限制异常类
     */
    public class FileNameLengthLimitExceededException extends FileException {
        private static final long serialVersionUID = 1L;
    
        public FileNameLengthLimitExceededException(int defaultFileNameLength) {
            super("upload.filename.exceed.length", new Object[]{defaultFileNameLength});
        }
    }
    
  4. 使用SpringBoot提供的异常处理(AOP技术)

    /**
     * 全局异常处理器
     */
    @RestControllerAdvice
    public class GlobalExceptionHandler {
        private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    
        /**
         * 基础异常
         */
        @ExceptionHandler(BaseException.class)
        public Result baseException(BaseException e) {
            return Result.error(e.getDefaultMessage());
        }
        
        // 以下是自定义注解捕获异常的逻辑
         /**
         * 自定义验证异常
         */
        @ExceptionHandler(BindException.class)
        public Result validatedBindException(BindException e) {
            log.error(e.getMessage(), e);
            String message = e.getAllErrors().get(0).getDefaultMessage();
            return Result.error(message);
        }
    
        /**
         * 自定义验证异常
         */
        @ExceptionHandler(MethodArgumentNotValidException.class)
        public Result validExceptionHandler(MethodArgumentNotValidException e) {
            log.error(e.getMessage(), e);
            String message = e.getBindingResult().getFieldError().getDefaultMessage();
            return Result.error(message);
        }
    }
    

总结一下

  1. 自定义异常类,一般继承RuntimeException
  2. 进行模块划分
  3. 全局异常捕获
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值