SpringBoot精简返回异常,自定义异常类。

159 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

为什么要精简返回给客户端的异常消息

如果我们不处理后端的异常消息,那每次返回给客户端的都是一长串的错误信息,不方便前端处理,也给用户非常不友好的使用体验。这时候就必须对错误信息进行精简处理,前端也不需要过于详细的后端报错信息。

封装自定义异常类

因为我们的项目是web项目,所以我们返回的异常消息必须都封装上状态码,所以我们还需要自定义异常类,用于异常消息的封装与返回。

自定义异常类,我选择继承RuntimeException。没有选择Exception,是因为Exception类型必须显示的处理,而RuntimeException会由虚拟机隐式处理。

创建自定义异常类

@Data
public class DomeException extends RuntimeException{
    private String msg;
    private int code = 500;

    public DomeException(String msg) {
        super(msg);
        this.msg = msg;
    }

    public DomeException(String msg, Throwable e) {
        super(msg, e);
        this.msg = msg;
    }

    public DomeException(String msg, int code) {
        super(msg);
        this.msg = msg;
        this.code = code;
    }

    public DomeException(String msg, int code, Throwable e) {
        super(msg, e);
        this.msg = msg;
        this.code = code;
    }
}

精简返回给客户端的异常消息

创建好自定义异常类以后,就可以编写异常消息拦截类。

@Slf4j
// 全局捕获spring mvc抛的异常
@RestControllerAdvice
public class ExceptionAdvice {

    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    // 用来捕获指定的异常,这里是捕获所有异常
    @ExceptionHandler(Exception.class)
    public String validExceptionHandler(Exception e) {
        log.error("执行异常",e);
        // 捕获校验异常
        if (e instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException exception = (MethodArgumentNotValidException) e;
            //将错误信息返回给前台
            return exception.getBindingResult().getFieldError().getDefaultMessage();
        }
        // 捕获自定义异常
        else if(e instanceof DomeException){
            EmosException exception=(EmosException)e;
            return exception.getMsg();
        }
        // 捕获权限检验异常
        else if(e instanceof UnauthorizedException){
            return "你不具有相关权限";
        }
        else {
            return "后端执行异常";
        }
    }
}

这个只是示例,可以在这个基础上扩张更多自己的异常处理方法。