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
本文只发表于博客园和tonglin0325的博客,作者:tonglin0325,转载请注明原文链接:https://www.cnblogs.com/tonglin0325/p/5318281.html

浙公网安备 33010602011771号