• springboot统一处理异常(转)


    在springboot开发中经常会遇到接口异常,如果没有特别处理,就会给一个大白板

    这个就很不友好了,查看具体问题还需要去后台看日志

    专业的做法是在Controller层统一做一次异常的捕捉和处理

    一、异常枚举类

    首先定义一个异常枚举类,用来存放所有异常,实际用的时候可以酌情增减

    public enum ResponseEnum {
        SUCCESS("0000","调用成功"),
        ERROR1("0001","空指针异常"),
        ERROR2("0002","数字转换异常"),
        ERROR3("0003","数组越界异常"),
        ERROR4("0004","参数异常"),
        ERROR5("0005","请求方法异常"),
        ERROR9999("9999","其他异常");
    
        private final String returnCode;
        private final String returnMessage;
    
        ResponseEnum(String returnCode, String returnMessage) {
            this.returnCode = returnCode;
            this.returnMessage = returnMessage;
        }
    
        public String getReturnCode() {
            return returnCode;
        }
    
        public String getReturnMessage() {
            return returnMessage;
        }
    }

    二、返回值工具类

    所有接口的返回值都要包含返回码和返回message,写个工具类统一处理

    public class BaseResultUtils {
    
    
        public static BaseResponse setResult(String code, String msg, Object data) {
            return new BaseResponse(code, msg, data);
        }
    
        public static BaseResponse setResult(String code, String msg) {
            return setResult(code, msg, null);
        }
    
        public static BaseResponse success(Object data){
            return setResult(SUCCESS.getReturnCode(),SUCCESS.getReturnMessage(),data);
        }
    
        public static BaseResponse error(ResponseEnum responseEnum) {
            return setResult(responseEnum.getReturnCode(),responseEnum.getReturnMessage());
        }
    }

    三、统一的返回格式类

    所有返回的字符串里都包含这三个部分:returnCode 、returnMessage和data

    @EqualsAndHashCode(callSuper = false)
    public class BaseResponse<T> implements Serializable {
       @ApiModelProperty("状态码")
        private String returnCode ;
        /**
         * 业务码描述
         */
        @ApiModelProperty("返回提示")
        private String returnMessage ;
        /**
         * 数据结果集
         */
        @ApiModelProperty("数据")
        private T data;
     public BaseResponse(String returnCode, String returnMessage, T data) {
            this.returnCode = returnCode;
            this.returnMessage = returnMessage;
            this.data = data;
        }
    }

    四、异常拦截类

    @ControllerAdvice
    @ResponseBody
    public class GlobalException {
        private final Logger logger = LoggerFactory.getLogger(GlobalException.class);
    
        @ExceptionHandler(value = {java.lang.NullPointerException.class})
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        public BaseResponse nullPointerExceptionHandler(HttpServletResponse response, Exception e) {
            e.printStackTrace();
            return BaseResultUtils.error(ERROR1);
        }
    
    
        /**
         * 其他异常
         *
         * @param e
         * @return
         */
        @ExceptionHandler(value = Exception.class)
        @ResponseBody
        public BaseResponse exceptionHandler(Exception e) {
            e.printStackTrace();
            return BaseResultUtils.error(ERROR9999);
        }
    
    }

    这样不管接口又什么异常,都可以被捕捉到,可以给前端一些提示信息,比方参数写错了,请求方法写错了之类

    具体的报错日志还是需要去后台查看

    参考:https://www.jianshu.com/p/7c4d3c7a28ae

  • 相关阅读:
    cdoj793-A Linear Algebra Problem
    C语言各种数据类型取值范围
    taro 在components文件夹中 新建组件时,组件支持自定义命名,但是不能大写开头
    taro 不支持render中,使用函数多条件渲染
    taro 引用相对路径图片
    taro CSS Modules 的使用
    taro refs引用
    taro 环境判断
    input 禁止 复制 粘贴 剪切 操作
    windows 系统中 use arrow keys怎么操作?
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/14874304.html
Copyright © 2020-2023  润新知