前言
开发中,经常需要对业务异常进行处理;而往往业务中会出现很多种情况需要进行业务处理,例如查询人员数据为空、人员角色不符、人员收货地址不存在等等,都需要try catch进行不同的处理。这样的try catch会造成大量的重复代码,此时就需要全局异常捕获@RestControllerAdvice,通过它来构建一个全局捕获根据不同的异常类型来进行统一的处理。
1、构建自定义业务异常-BusinessException
public class BusinessException extends RuntimeException {
private Integer code;
private String message;
public BusinessException(Integer code, String message) {
super();
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2、创建全局统一异常处理
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
// 统一处理业务异常-BusinessException
@ExceptionHandler(value = BusinessException.class)
public NormalResponse businessException(HttpServletRequest request,BusinessException e){
log.error("{}请求异常{}",request.getRequestURL(),e.getMessage());
return NormalResponse.fail(e.getMessage());
}
}
3、在业务中使用
public void testGlobalException() {
// 业务处理...
Student student = studentMapper.selectById(10086);
if (Objects.isNull(student)) {
throw new BusinessException(20001, "查询人员不存在");
}
// 正常逻辑处理...
}
假设我们在业务处理中,需要查询id=10086的学生,然后对这个学生的信息进行处理(更新,添加字段等),当查询人员不存在时,需要提醒接口调用方出现了业务问题-查询人员不存在。
4、演示结果
控制台日志:
2024-09-10 15:48:15.893 ERROR 51752 --- [nio-6024-exec-3] c.s.d.exception.GlobalExceptionHandler : http://localhost:6024/test/global-exception请求异常查询人员不存在
15:48:15.893 [http-nio-6024-exec-3] ERROR c.s.d.e.GlobalExceptionHandler - http://localhost:6024/test/global-exception请求异常查询人员不存在
postman接口返参:
{
"code": -1,
"message": null,
"data": "查询人员不存在"
}