美文网首页
异常处理与分析

异常处理与分析

作者: striveSmile | 来源:发表于2018-12-21 17:05 被阅读0次

    1、系统对异常的处理使用统一的异常处理流程:

    1、自定义异常类型。

    2、自定义错误代码及错误信息。

    3、对于可预知的异常由程序员在代码中主动抛出,由SpringMVC统一捕获
    可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。

    4、对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常。
    不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类型为
    RuntimeException类型(运行时异常)。

    5、可预知的异常及不可预知的运行时异常最终会采用统一的信息格式(错误代码+错误信息)来表示,最终也会随请求响应给客户端。

    异常抛出及处理流程:


    image.png

    1、在controller、service、dao中程序员抛出自定义异常;springMVC框架抛出框架异常类型

    2、统一由异常捕获类捕获异常,并进行处理

    3、捕获到自定义异常则直接取出错误代码及错误信息,响应给用户。

    4、捕获到非自定义异常类型首先从Map中找该异常类型是否对应具体的错误代码,如果有则取出错误代码和错误信息并响应给用户,如果从Map中找不到异常类型所对应的错误代码则统一为99999错误代码并响应给用户。

    5、将错误代码及错误信息以Json格式响应给用户。

    1.1可预知异常处理

    1.1.1自定义异常类
    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;
        }
    }
    
    
    1.1.2异常抛出类
    public class ExceptionCast {
    
        //使用此静态方法抛出自定义异常
        public static void cast(ResultCode resultCode){
            throw new CustomException(resultCode);
        }
    }
    

    1.1.3异常捕获类

    @ControllerAdvice
    public class ExceptionCatch {
        private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);
    
        @ExceptionHandler(CustomException.class)
        @ResponseBody
        public ResponseResult  customException(CustomException e){
    
            LOGGER.error("catch exception : {}\r\nexception: ",e.getMessage(), e);
    
            ResultCode resultCode = e.getResultCode();
            ResponseResult responseResult = new ResponseResult(resultCode);
            return responseResult;
    
        }
    }
    

    1.2不可预知异常处理

    1.2.1异常捕获方法

    针对上边的问题其解决方案是:
    1、我们在map中配置HttpMessageNotReadableException和错误代码。
    2、在异常捕获类中对Exception异常进行捕获,并从map中获取异常类型对应的错误代码,如果存在错误代码则返回此错误,否则统一返回99999错误。
    3、在异常捕获类中配置 HttpMessageNotReadableException 为非法参数异常。
    异常捕获类代码如下:

    @ControllerAdvice
    public class ExceptionCatch {
        private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);
    
        //定义map,配置异常类型所对应的错误代码
        private static ImmutableMap<Class<? extends Throwable>,ResultCode> EXCEPTIONS;
        //定义map的builder对象,去构建ImmutableMap
        protected static ImmutableMap.Builder<Class<? extends Throwable>,ResultCode> builder = ImmutableMap.builder();
    
        //捕获CustomException此类异常
        @ExceptionHandler(CustomException.class)
        @ResponseBody
        public ResponseResult customException(CustomException customException){
            //记录日志
            LOGGER.error("catch exception:{}",customException.getMessage());
            ResultCode resultCode = customException.getResultCode();
            return new ResponseResult(resultCode);
        }
        //捕获Exception此类异常
        @ExceptionHandler(Exception.class)
        @ResponseBody
        public ResponseResult exception(Exception exception){
            //记录日志
            LOGGER.error("catch exception:{}",exception.getMessage());
            if(EXCEPTIONS == null){
                EXCEPTIONS = builder.build();//EXCEPTIONS构建成功
            }
            //从EXCEPTIONS中找异常类型所对应的错误代码,如果找到了将错误代码响应给用户,如果找不到给用户响应99999异常
            ResultCode resultCode = EXCEPTIONS.get(exception.getClass());
            if(resultCode !=null){
                return new ResponseResult(resultCode);
            }else{
                //返回99999异常
                return new ResponseResult(CommonCode.SERVER_ERROR);
            }
    
    
        }
    
        static {
            //定义异常类型所对应的错误代码
            builder.put(HttpMessageNotReadableException.class,CommonCode.INVALID_PARAM);
        }
    }
    

    相关文章

      网友评论

          本文标题:异常处理与分析

          本文链接:https://www.haomeiwen.com/subject/vqnmkqtx.html