SpringBoot 异常处理 最佳实践

  1. BizException
  2. ExceptionType
  3. ErrorResponse
  4. GlobalExcepitonHandler

​🔧​ 对于异常, 我们一般需要处理的是 一些自定义的异常为了扩展性,我们一般需要定义一个异常对象(BizException, 以及一个自定义异常枚举类(ExceptionType这样我们就可以在可能报错的地方抛出异常

🔩​ 有了异常对象,我们就需要把异常信息反馈给用户, 所以需要一个异常信息返回对象ErrorResponse然后通过springboot的全局异常处理, 把异常信息返回, (一般springboot会有默认的异常处理页面以及异常处理信息, 但是我们不用他们的

1. BizException

​ ​🛑​ BizException.java

public class BizException extends RuntimeException{

    private final Integer code;

    public Integer getCode() {
        return code;
    }

    public BizException(ExceptionType exceptionType) {
        super(exceptionType.getMessage());
        this.code = exceptionType.getCode();
    }
}

2. ExceptionType

🛑​ ExceptionType.java

public enum ExceptionType {

// 自定义异常类型
//  **************begin **************
    INNER_ERROR(500, "系统内部错误"),
    UNAUTHORIZED(401, "未登录"),
    BAD_REQUEST(400, "请求错误"),
    FORBIDDEN(403, "无权操作"),
    NOT_FOUND(404, "未找到"),
    USER_NAME_DUPLICATE(40001001, "用户名重复"),
    USER_NOT_FOUND(40401002, "用户不存在");
//  **************end **************

    private final Integer code;
    private final String message;

    ExceptionType(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

3. ErrorResponse

​ ​🛑​ ErrorResponse.java

@Data
public class ErrorResponse {

    private Integer code;
    private String message;
    private Object trace;
}

4. GlobalExcepitonHandler

​ ​🛑​ GlobalExcepitonHandler.java

@RestControllerAdvice
public class GlobalExceptionHandler {


    @ExceptionHandler(value = BizException.class)
    public ErrorResponse bizExceptionHandler(BizException e) {
        ErrorResponse errorResponse = new ErrorResponse();
        errorResponse.setCode(e.getCode());
        errorResponse.setMessage(e.getMessage());
        errorResponse.setTrace(e.getStackTrace());
        return errorResponse;
    }


    @ExceptionHandler(value = Exception.class)
    public ErrorResponse ExceptionHandler(Exception e) {
        ErrorResponse errorResponse = new ErrorResponse();
        errorResponse.setCode(ExceptionType.INNER_ERROR.getCode());
        errorResponse.setMessage(ExceptionType.INNER_ERROR.getMessage());
        return errorResponse;
    }


    @ExceptionHandler(value = AccessDeniedException.class)
    @ResponseStatus(HttpStatus.FORBIDDEN)
    public ErrorResponse accessDeniedHandler(Exception e) {
        ErrorResponse errorResponse = new ErrorResponse();
        errorResponse.setCode(ExceptionType.FORBIDDEN.getCode());
        errorResponse.setMessage(ExceptionType.FORBIDDEN.getMessage());
        return errorResponse;
    }


    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ErrorResponse bizExceptionHandler(MethodArgumentNotValidException e) {
        ErrorResponse errorResponse = new ErrorResponse();
        e.getBindingResult().getAllErrors().forEach(objectError -> {
            errorResponse.setCode(ExceptionType.BAD_REQUEST.getCode());
            errorResponse.setMessage(objectError.getDefaultMessage());
        });
        return errorResponse;
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值