zoukankan      html  css  js  c++  java
  • springboot2.0处理任何异常返回通用数据格式

    异常分为以下三种

    • 自定义异常
    • 可预知异常
    • 不可预知异常

    下面具体说明如何分类处理,从而保证无论触发什么异常均可返回理想的自定义数据格式

    ResultCode

    /**
     * Created by mrt on 2018/3/5.
     * 10000-- 通用错误代码
     * 22000-- 媒资错误代码
     * 23000-- 用户中心错误代码
     * 24000-- cms错误代码
     * 25000-- 文件系统
     */
    public interface ResultCode {
        //操作是否成功,true为成功,false操作失败
        boolean success();
        //操作代码
        int code();
        //提示信息
        String message();
    
    }
    

    ResponseResult

    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
    
    @Data
    @ToString
    @NoArgsConstructor
    public class ResponseResult implements Response {
    
        //操作是否成功
        boolean success = SUCCESS;
    
        //操作代码
        int code = SUCCESS_CODE;
    
        //提示信息
        String message;
    
        public ResponseResult(ResultCode resultCode) {
            this.success = resultCode.success();
            this.code = resultCode.code();
            this.message = resultCode.message();
        }
    
        public static ResponseResult SUCCESS() {
            return new ResponseResult(CommonCode.SUCCESS);
        }
    
        public static ResponseResult FAIL() {
            return new ResponseResult(CommonCode.FAIL);
        }
    
    }
    

    自定义异常类

    import com.xuecheng.framework.model.response.ResultCode;
    
    /**
     * 自定义异常
     *
     * @author john
     * @date 2019/12/20 - 10:57
     */
    public class CustomException extends RuntimeException {
        private ResultCode resultCode;
    
        public CustomException(ResultCode resultCode) {
            //异常信息为错误代码+异常信息
            super("错误代码:" + resultCode.code() + "错误信息:" + resultCode.message());
            this.resultCode = resultCode;
        }
    
        public ResultCode getResultCode() {
            return this.resultCode;
        }
    }
    

    CommonCode (自定义异常信息返回数据枚举类)

    import lombok.ToString;
    
    @ToString
    public enum CommonCode implements ResultCode{
        INVALID_METHOD(false,10004,"非法方法!"),
        INVALID_PARAM(false,10003,"非法参数!"),
        SUCCESS(true,10000,"操作成功!"),
        FAIL(false,11111,"操作失败!"),
        UNAUTHENTICATED(false,10001,"此操作需要登陆系统!"),
        UNAUTHORISE(false,10002,"权限不足,无权操作!"),
        SERVER_ERROR(false,99999,"抱歉,系统繁忙,请稍后重试!");
    //    private static ImmutableMap<Integer, CommonCode> codes ;
        //操作是否成功
        boolean success;
        //操作代码
        int code;
        //提示信息
        String message;
        private CommonCode(boolean success,int code, String message){
            this.success = success;
            this.code = code;
            this.message = message;
        }
    
        @Override
        public boolean success() {
            return success;
        }
        @Override
        public int code() {
            return code;
        }
    
        @Override
        public String message() {
            return message;
        }
    
    
    }
    
    

    异常处理(包含自定义异常和不可预见异常和可预见异常)

    import com.google.common.collect.ImmutableMap;
    import com.xuecheng.framework.model.response.CommonCode;
    import com.xuecheng.framework.model.response.ResponseResult;
    import com.xuecheng.framework.model.response.ResultCode;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.http.converter.HttpMessageNotReadableException;
    import org.springframework.web.HttpRequestMethodNotSupportedException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    /**
     * @author john
     * @date 2019/12/20 - 11:01
     */
    @Slf4j
    @ControllerAdvice
    public class ExceptionCatch {
        //使用EXCEPTIONS存放异常类型和错误代码的映射,ImmutableMap的特点的一旦创建不可改变,并且线程安全
        private static ImmutableMap<Class<? extends Throwable>, ResultCode> EXCEPTIONS;
        //使用builder来构建一个异常类型和错误代码的异常
        protected static ImmutableMap.Builder<Class<? extends Throwable>, ResultCode> builder =
                ImmutableMap.builder();
    
        static {
            //在这里加入一些基础的异常类型判断---异常存在非自定义异常
            // 参数异常
            // 请求方法异常
            builder.put(HttpMessageNotReadableException.class, CommonCode.INVALID_PARAM);
            builder.put(HttpRequestMethodNotSupportedException.class, CommonCode.INVALID_METHOD);
        }
    
    
        //捕获   CustomException异常
        @ExceptionHandler(CustomException.class)
        @ResponseBody
        public ResponseResult customException(CustomException e) {
            log.error("catch   exception   :   {}
    exception:   ", e.getMessage(), e);
            ResultCode resultCode = e.getResultCode();
            return new ResponseResult(resultCode);
        }
    
    
        //捕获Exception异常---非自定义异常
        @ResponseBody
        @ExceptionHandler(Exception.class)
        public ResponseResult exception(Exception e) {
            log.error("catch   exception   :   {}
    exception:   ", e.getMessage(), e);
            if (EXCEPTIONS == null)
                EXCEPTIONS = builder.build();
            // 查看异常是否被定义返回格式---没有就返回默认错误格式
            final ResultCode resultCode = EXCEPTIONS.get(e.getClass());
            final ResponseResult responseResult;
            if (resultCode != null) {
                responseResult = new ResponseResult(resultCode);
            } else {
                responseResult = new ResponseResult(CommonCode.SERVER_ERROR);
            }
            return responseResult;
        }
    }
    
    

  • 相关阅读:
    c++ string::size详解
    fatal error LNK1120: 1 个无法解析的外部命令
    c多个空格转成一个空格
    算法导论之三:快速排序
    转:C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
    vc6.0怎么调整工作空间到左边??
    2008生产实习 C++ 实习计划
    WCF是什么
    收藏:Silverlight 2.0 Beta Control Hierarchy (Silverlight 2.0控件层次结构图)
    A potentially dangerous Request.Form value was detected from the client 的解决方法
  • 原文地址:https://www.cnblogs.com/ifme/p/12072531.html
Copyright © 2011-2022 走看看