SpringBoot全局异常处理器

全局异常捕获

SpringBoot中,@ControllerAdvice 即可开启全局异常处理,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用@ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。

1.自定义异常

1
2
3
4
5
6
7
8
9
10
11
/**
* @Author wzy
* @Date 2023/12/27 14:52
* @description: 自定义异常
*/
public class CustomException extends RuntimeException{
public CustomException(String message) {
super(message);
}
}

2.通用报错信息枚举类

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
package com.wzy.base.exception;

/**
* @Author wzy
* @Date 2023/12/27 15:02
* @description: 通用报错信息
*/
public enum CommonError {
UNKOWN_ERROR("执行过程异常,请重试。"),
PARAMS_ERROR("非法参数"),
OBJECT_NULL("对象为空"),
QUERY_NULL("查询结果为空"),
REQUEST_NULL("请求参数为空");

private String errMessage;

public String getErrMessage() {
return errMessage;
}

private CommonError( String errMessage) {
this.errMessage = errMessage;
}

}

3.和前端约定好返回给前端的异常信息

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
package com.wzy.base.exception;

import java.io.Serializable;

/**
* @Author wzy
* @Date 2023/12/27 14:46
* @description: 返回给前端的异常信息
*/
public class RestErrorResponse implements Serializable {
private String errMessage;

public void setErrMessage(String errMessage) {
this.errMessage = errMessage;
}

public String getErrMessage() {
return errMessage;
}

public RestErrorResponse(String errMessage) {
this.errMessage = errMessage;
}
}

4.全局异常处理器

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
package com.wzy.base.exception;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

/**
* @Author wzy
* @Date 2023/12/27 15:07
* @description: 全局异常处理器
*/
@Slf4j
@ControllerAdvice//控制器增强 基于aop切面实现异常捕获
public class GlobalExceptionHandler {
@ResponseBody //以json数据返回
@ExceptionHandler(CustomException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse restErrorResponse(CustomException customException){
log.error("系统异常:{}",customException.getMessage(),customException);
return new RestErrorResponse(customException.getMessage());
}

@ResponseBody
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse restErrorResponse(Exception exception){
log.error("系统异常:{}",exception.getMessage(),exception);
return new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());
}
}

@ControllerAdvice+@ResponseBody可以用@RestControllerAdvice代替。

@ControllerAdvice:用来开启全局的异常捕获

@ExceptionHandler:说明捕获哪些异常,对哪些异常进行处理。不同的异常应该定义不同的方法来捕获。

当配置了全局异常处理器,在业务中的异常就要把它抛出,而不能try…catch。

示例:

1
2
3
4
5
6
7
8
9
10
//合法性校验
if(StringUtils.isBlank(addCourseDto.getName())){
throw new CustomException("课程名称不能为空");
}
if(StringUtils.isBlank(addCourseDto.getUsers())){
throw new CustomException("使用人群不能为空");
}
if(StringUtils.isBlank(addCourseDto.getMt())){
throw new CustomException("课程大分类不能为空");
}