统一异常处理的简单实现

异常抛出与处理流程

在这里插入图片描述

  1. 自定义异常类型;
  2. 自定义错误代码及错误信息;
  3. 对于可预知异常(自定义异常)主动抛出,由SpringMVC统一捕获;
  4. 对于不可预知异常(运行时异常)由SpringMVC统一捕获Exception类型的异常;
  5. 最终所有异常采用统一信息格式(错误代码+错误信息)随请求响应给客户端。

可预知异常

自定义异常类型

@AllArgsConstructor
@Getter
public class CustomException extends RuntimeException {
    ResultCode resultCode;
}

响应格式

public interface ResultCode {
    //操作是否成功,true为成功,false操作失败
    boolean success();
    //操作代码
    int code();
    //提示信息
    String message();
}

响应结果类

@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 interface Response {
    public static final boolean SUCCESS = true;
    public static final int SUCCESS_CODE = 10000;
}    
public class ExceptionCast {
    public static void cast(ResultCode resultCode) {
        throw new CustomException(resultCode);
    }
}

具体的异常内容定义在枚举类中

统一异常捕获类
@RestControllerAdvice
@Slf4j
public class ExceptionCatch {

    @ExceptionHandler(CustomException.class)
    public ResponseResult customException(CustomException customException) {
        log.error("catch exception: {}", customException.getMessage());
        ResultCode resultCode = customException.getResultCode();
        return new ResponseResult(resultCode);
    }
}

可由前端接收到异常信息,回显至页面。

不可预知异常

在原本的统一异常捕获类中增加:

@RestControllerAdvice
@Slf4j
public class ExceptionCatch {

    // 定义map
    private static ImmutableMap<Class<? extends Throwable>, ResultCode> EXCEPTIONS;
    protected static ImmutableMap.Builder<Class<? extends Throwable>, ResultCode> builder = ImmutableMap.builder();

    // 定义异常类型所对应的错误信息
    static {
        builder.put(HttpMessageNotReadableException.class, CommonCode.INVALID_PARAM);
    }

    @ExceptionHandler(CustomException.class)
    public ResponseResult customException(CustomException customException) {
        log.error("catch exception: {}", customException.getMessage());
        ResultCode resultCode = customException.getResultCode();
        return new ResponseResult(resultCode);
    }

    @ExceptionHandler(Exception.class)
    public ResponseResult exception(Exception exception) {
        log.error("catch exception: {}", exception.getMessage());
        if (EXCEPTIONS == null) {
            EXCEPTIONS = builder.build();  // 构建map
        }
        // 从map中查询错误信息
        ResultCode resultCode = EXCEPTIONS.get(exception.getClass());
        if (resultCode != null) {
            return new ResponseResult(resultCode);
        } else {
            return new ResponseResult(CommonCode.SERVER_ERROR);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值