异常解决方案

自定义异常类型
自定义错误代码及错误信息
对于可预知的异常由程序员在代码中主动抛出 由SpringMVC捕获
可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较
齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。
对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常
不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类型为RuntimeException类型(运行时异常)
可预知的异常及不可预知的运行时异常最终会采用统一的信息格式(错误代码+错误信息)来表示 最后也会随请求相应给客户端
在这里插入图片描述
具体的流程
在controller、service、dao中程序员抛出自定义异常;SpringMVC框架抛出框架异常类型
统一由异常捕获类捕获异常,并进行处理
捕获到自定义异常则直接取出错误代码及错误信息 相应给客户
捕获到非自定义异常类型首先从map中找该异常类型是否对应具体的错误代码 如果由则去除错误代码及错误信息返回给客户 如果map中找不到异常类型所对应哪个的错误代码则统一位99999错误代码并返回给用户

在service方法中的编码顺序是先校验判断,有问题则抛出具体的y异常信息,最后执行具体的业务操作 返回成功信息
编写统一异常处理类去捕获异常 向用户返回统一规范的相应信息
service模板
在这里插入图片描述

首先定义相应格式
在这里插入图片描述
编写自定义异常类
在这里插入图片描述
异常抛出类
在这里插入图片描述
异常捕获类

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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * User: 李锦卓
 * Time: 2019/1/8 17:17
 */
@ControllerAdvice
public class ExceptionCatch {
    private static final Logger logger = LoggerFactory.getLogger(ExceptionCatch.class);

    //捕获CustomException异常
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public ResponseResult customException(CustomException e) {
        ResultCode resultCode = e.getResultCode();
        ResponseResult responseResult = new ResponseResult(resultCode);
        return responseResult;
    }

    //使用EXCEPTIONS存放异常类型和错误代码映射 ImmutableMap的特点是一旦创建不可改变 并且线程安全
    // 定义map 配置异常类型所对应的错误代码
    private static ImmutableMap<Class<? extends Throwable>, ResultCode> EXCEPTIONS;
    //定义map的builder对象 去构建ImmutableMap对象
    protected static ImmutableMap.Builder<Class<? extends Throwable>, ResultCode> builder = ImmutableMap.builder();

    //使用build来构建一个y异常类型和错误代码异常
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseResult exception(Exception e) {
        if (EXCEPTIONS == null) {
            EXCEPTIONS = builder.build(); //EXCEPTIONS构建成功
        }
        //从EXCEPTIONS中找异常类型所对因的错误代码 如果找到了将错误代码相应给用户 如果找不到响应9999异常
        ResultCode resultCode = EXCEPTIONS.get(e.getClass());
        if (resultCode != null) {
            return new ResponseResult(resultCode);
        } else {
            return new ResponseResult(CommonCode.SERVER_ERROR);
        }
    }

    static {
        builder.put(HttpMessageNotReadableException.class, CommonCode.INVALID_PARAM);
    }
}

测试 抛出异常
在这里插入图片描述
前端相应信息
在这里插入图片描述

发布了10 篇原创文章 · 获赞 2 · 访问量 1812

猜你喜欢

转载自blog.csdn.net/ZhuRiZheWuGe/article/details/86105802