SpringBoot的异常处理

全局异常处理

对整个项目的异常进行自动拦截处理,方便以后抛出自定义异常

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

@ExceptionHandler(MethodArgumentNotValidException.class)
public String MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
// 从异常对象中拿到ObjectError对象
ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
// 然后提取错误提示信息进行返回
return ResponseEntity.failed(objectError.getDefaultMessage());
}

@ExceptionHandler(Exception.class)
public ResponseEntity exceptionHandler(Exception e){
//打印异常信息
log.error("出现了异常! {}",e);
//从异常对象中获取提示信息封装返回
return ResponseEntity.failed(e.getMessage());
}
}
  • @RestControllerAdvice表示该类为异常处理类,rest是对ControllerAdvice的增强同RestController

  • @ExceptionHandler指定你需要处理的异常类

自定义异常

方便携带更多的错误信息如状态码等..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Getter //只要getter方法,无需setter
public class APIException extends RuntimeException {
private int code;
private String msg;

public APIException() {
this(XXX, "接口错误");
}

public APIException(String msg) {
this(XXX, msg);
}

public APIException(int code, String msg) {
super(msg);
this.code = code;
this.msg = msg;
}
}

交给全局异常处理解决:

1
2
3
4
5
6
@ExceptionHandler(APIException.class)
public String APIExceptionHandler(APIException e) {
//打印异常信息
log.error("出现了异常! {}",e);
return ResponseEntity.failed(e.getMsg());
}

ResponseEntity为统一的响应实体方便与前端联调

参考