tonglin0325的个人主页

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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;

}

  1. 定义全局的异常处理

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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中添加配置来解决

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

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

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

 

日志信息

1
2
3
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