提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在Springboot应用中,我们经常会面临各种异常的处理,如果异常处理分散在代码各个地方的话,一方面增加了很多重复处理异常的工作量,另一方面也不好进行维护。其实Springboot是可以实现对异常的统一处理的,常用的有两种方式,我们来看下。
一、AOP方式
AOP方式,可以在服务层、controller层、其他任何层中捕获并处理异常。可以定义切面并使@Around注解来捕获方法抛出的异常,然后执行自定义的处理逻辑。
1. 引入Spring AOP的相关依赖
在pom.xml文件中引入Spring AOP的相关依赖。
<!-- Spring AOP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. 创建异常统一处理类
使用@Aspect注解创建异常统一处理类
@Aspect
@Component
public class ServiceExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(ServiceExceptionHandler.class);
@Around("execution(* com.example.demo.app.*.*(..))")
public Object handleServiceException(ProceedingJoinPoint joinPoint) throws Throwable {
try {
// 执行Service层方法
return joinPoint.proceed();
} catch (BusinessException e) {
// 捕获ServiceException并处理
// 例如,记录日志、返回自定义错误消息等
LOGGER.error("业务异常", e);
return ResultWrapper.error(e.getErrorCode(), e.getMessage());
}
}
}
二、@RestControllerAdvice注解方式
使用@RestControllerAdvice注解对controller层进行统一异常处理。
代码如下:
@RestControllerAdvice
public class ExceptionAdvice {
private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionAdvice.class);
@ExceptionHandler(IllegalArgumentException.class)
public ResultWrapper handleIllegalArgumentException(IllegalArgumentException e) {
LOGGER.error("参数非法", e);
return ResultWrapper.error(ErrorCode.INVALID_INPUT.getCode(), e.getMessage());
}
@ExceptionHandler(BusinessException.class)
public ResultWrapper handleBusinessException(BusinessException e) {
LOGGER.error("业务异常", e);
return ResultWrapper.error(e.getErrorCode(), e.getMessage());
}
@ExceptionHandler(Exception.class)
public ResultWrapper handleException(Exception e) {
LOGGER.error("异常错误", e);
return ResultWrapper.error(ErrorCode.INTERNAL_SERVER_ERROR.getCode(), e.getMessage());
}
}
总结
在Spring Boot中,可以使用AOP、@RestControllerAdvice注解方式来对异常进行统一处理,以提高代码的可维护性和错误处理的一致性。其中AOP方式可以在服务层、controller层、其他任何层中捕获并处理异常,适用范围较广。@RestControllerAdvice注解方式则是针对controller层进行统一异常处理。我们可以根据具体场景来选择具体的方式实现对异常的统一处理。