SpringBoot学习笔记——统一的异常处理

可以使用 @RestControllerAdvice 拦截异常并进行统一处理

1.首先定义统一的异常码 ResultCode,

其中code以HTTP code status为前缀,后缀为具体异常编号

message为异常消息,前端可以直接拿来显示给用户

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum ResultCode {

    // 200
    SUCCESS(200, "成功"),

    // 401
    UN_AUTH(40101, "该用户未认证"),

    // 403
    ACCESS_DENIED(40301, "该用户无权限"),

    // 404
    API_NOT_FOUND(40401, "请求的API不存在"),
    RESOURCE_NOT_FOUND(40402, "请求的资源不存在"),

    // 500
    SYS_UNKNOWN_ERROR(50001, "未知系统错误,请稍后再试"),

    // 状态码
    private Integer code;
    // 提示信息
    private String message;

}

2. 定义全局的异常处理

比如在其中对API接口不存在抛出的异常 NoHandlerFoundException 进行了拦截,并返回统一的异常码

import com.example.demo.common.ControllerResponseT;
import com.example.demo.common.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.NoHandlerFoundException;

import javax.servlet.http.HttpServletRequest;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler(NoHandlerFoundException.class)
    public ControllerResponseT apiNotFoundException(final Throwable e, final HttpServletRequest request) {
        String message = ResultCode.API_NOT_FOUND.getMessage();
        log.error(message + " => {}", e.getMessage());
        return ControllerResponseT.ofFail(ResultCode.API_NOT_FOUND.getCode(), message, " API [" + request.getRequestURI() + "] 不存在");
    }

}

其中对于404的异常捕获不到的话,需要在application.properties中添加配置来解决

# mvc
spring.mvc.throw-exception-if-no-handler-found=true
spring.mvc.static-path-pattern=/resources/**

参考:Spring Boot之全局异常处理:404异常为何捕获不到?

请求不存在的接口返回结果

 

日志信息

2021-06-24 20:18:16.188  WARN 19926 --- [io-18080-exec-4] o.s.web.servlet.PageNotFound             : No mapping for GET /fail123
2021-06-24 20:18:16.196 ERROR 19926 --- [io-18080-exec-4] c.e.demo.handler.GlobalExceptionHandler  : 请求的API不存在 => No handler found for GET /fail123

  

posted @ 2016-03-25 09:36  tonglin0325  阅读(3100)  评论(0编辑  收藏  举报