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