不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2021-12-12 11:26:29  修改时间:2024-03-28 23:33:30  分类:Java框架/系统  编辑

默认情况下,Spring Boot 出错时,页面显示如下格式的错误信息:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Sun Dec 12 11:18:04 CST 2021
There was an unexpected error (type=Not Found, status=404).

 

原理:使用 @RestControllerAdvice 加 @ExceptionHandler 注解来实现,

  • 注意:@RestControllerAdvice只能拦截Controller层的异常不会拦截Interceptor的异常;
  • 优点:把异常统一处理,减少代码的重复编写,提高了可维护性;
  • 缺点:只能处理Controller层的异常,对于Interceptor层的异常,Spring内部的异常无能为力;

 

推荐SpringBoot系列(十)统一异常处理与统一结果返回(优化:把里面的 @ControllerAdvice 和 @ResponseBody 删掉,换成 @RestControllerAdvice)

Spring Boot @RestControllerAdvice 统一异常处理

Spring Boot 统一封装返回结果和异常情况

Spring Boot 统一返回数据格式和异常处理

【工作笔记】

1.全局异常类:

package love.hibotella.common.exception;

import love.hibotella.common.model.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(value = Exception.class)
    public Result<Object> exceptionHandler(Exception e) {
        logger.error(e.getMessage(), e);
        ErrorEnum serverError = ErrorEnum.INTERNAL_SERVER_ERROR;
        return Result.error(serverError.getErrorCode(), serverError.getErrorMsg(), null);
    }
}

2.错误枚举类:

package love.hibotella.common.exception;

/**
 * 常用异常 枚举
 */
public enum ErrorEnum {
    SUCCESS("200", "操作成功"),
    NO_AUTH("401", "请先登录"),
    NO_PERMISSION("403", "没有权限"),
    NOT_FOUND("404", "未找到该资源"),
    INTERNAL_SERVER_ERROR("500", "服务器内部错误"),
    ;

    /**
     * 错误码
     */
    private String errorCode;

    /**
     * 错误信息
     */
    private String errorMsg;

    ErrorEnum(String errorCode, String errorMsg) {
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }
}

3.Result<T> 业务结果类:

【Spring Boot】Java的业务操作结果类:Result<T>