Controller优化3:统一异常处理

Controller优化2链接:统一Json格式返回(注解实现)

以上过程依次递进,那么接下来就要考虑到另外一种,如果请求响应异常或失败,那么我该如何处理呢,上述几种貌似只做了正向假设,那么如果失败了呢?会影响结果么?

别担心 我们还有统一异常处理,与系列二类似的处理过程,前提是我们将所有的请求异常失败情况均已异常形式抛出去,这首先需要我们做一个自定义异常类:

/**
 * 自定义异常的基类,继承自运行时异常
 *
 * @author jockeys
 * @since 2020/2/2
 */
public class BusinessException extends RuntimeException {

    private static final String DEFAULT_CODE_VALUE="-1";
    private String code = DEFAULT_CODE_VALUE;

    /**
     * 构造器 (with code & msg )
     *
     * @param responseEnum 响应码的枚举实例
     */
    public BusinessException(ResponseEnum responseEnum) {
        this(responseEnum.getMessage());
        this.code = responseEnum.getCode();
    }

    /**
     * 构造器 (only msg)
     *
     * @param message 错误信息(msg)
     */
    public BusinessException(String message) {
        super(message);
    }

    public String getCode() {
        return this.code;
    }

    public BusinessException setCode(String code) {
        this.code = code;
        return this;
    }
}

假设所有我们能够感知的错误或异常情况均以BusinessException包装抛出,如果没有,那就属于程序猿编码bug,可以丢个程序员祭天嘞~

注意有两个比较重要的注解 @ControllerAdvice@ExceptionHandler 请自行查阅

/**
 * 统一异常处理器
 * java中异常分类 Exception->(IOException & RuntimeException),详情请自行查阅文档
 */
@Slf4j
@ControllerAdvice
public class ExceptionAdviceHandler {
    /**
     * RuntimeException异常捕获并统一处理
     */
    @ExceptionHandler(value = RuntimeException.class)
    @ResponseBody
    public ResponseJson handle(RuntimeException e) {
        log.info("RuntimeException异常或其子类异常捕获:{}", e.getMessage());

        if(e instanceof BusinessException){
            BusinessException ex=(BusinessException)e;
            log.error("{}:{}", ex.getClass(),ex.getMessage());
            return ResponseJson.error(ex.getCode(), ex.getMessage());
        }
        // 如果其他类型的RuntimeException子类,可在此处罗列
        // ……
        return ResponseJson.error(ResponseEnum.SERVER_ERROR.getCode(), e.getMessage());
    }

    /**
     * 顶级异常捕获并统一处理,当其他异常无法处理时候选择使用
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseJson handle(Exception e) {
        log.error("系统内部服务异常:{}", e.getMessage());
        return ResponseJson.error(ResponseEnum.SERVER_ERROR);
    }
}

以上操作之后,我们可以在Controller层进行具体业务代码的编写了,省去繁琐的封装过程

貌似也没有什么难点,做个笔记整理下~

你可能感兴趣的:(Controller优化3:统一异常处理)