截取Spring框架自动抛出异常
在Spring框架中,特别是使用Spring MVC或Spring Boot时,可以采用以下几种方式来截取和处理框架自动抛出的异常,使其更加符合应用的需求和提升用户体验:
1. 全局异常处理器 - @ControllerAdvice
使用@ControllerAdvice
注解定义一个全局异常处理类,可以捕获整个应用程序中控制器抛出的异常。
示例代码:
Java
1import org.springframework.http.ResponseEntity;
2import org.springframework.web.bind.annotation.ControllerAdvice;
3import org.springframework.web.bind.annotation.ExceptionHandler;
4import org.springframework.web.client.HttpClientErrorException;
5
6@ControllerAdvice
7public class GlobalExceptionHandler {
8
9 @ExceptionHandler(value = {HttpClientErrorException.class})
10 public ResponseEntity<String> handleHttpClientErrorException(HttpClientErrorException e) {
11 // 处理特定异常,例如HttpClientErrorException
12 return ResponseEntity.status(e.getStatusCode()).body("发生错误:" + e.getMessage());
13 }
14
15 @ExceptionHandler(value = {Exception.class})
16 public ResponseEntity<String> handleGeneralException(Exception e) {
17 // 处理其他未被捕获的异常
18 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("服务器内部错误:" + e.getMessage());
19 }
20}
2. 实现 HandlerExceptionResolver
实现HandlerExceptionResolver
接口,可以对所有控制器方法抛出的异常进行处理。
示例代码:
Java
1import org.springframework.web.servlet.HandlerExceptionResolver;
2import org.springframework.web.servlet.ModelAndView;
3
4public class CustomExceptionResolver implements HandlerExceptionResolver {
5
6 @Override
7 public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
8 // 根据异常类型自定义处理逻辑
9 if (ex instanceof NullPointerException) {
10 // 处理NullPointerException
11 } else if (ex instanceof IllegalArgumentException) {
12 // 处理IllegalArgumentException
13 } else {
14 // 默认处理逻辑
15 }
16 // 返回ModelAndView以控制视图和模型数据
17 }
18}
别忘了将自定义的异常解析器添加到Spring的配置中。
3. 使用AOP(面向切面编程)
通过AOP可以拦截方法调用,捕获并处理异常。
示例代码:
Java
1import org.aspectj.lang.annotation.Aspect;
2import org.aspectj.lang.annotation.AfterThrowing;
3import org.springframework.stereotype.Component;
4
5@Aspect
6@Component
7public class ExceptionHandlingAspect {
8
9 @AfterThrowing(pointcut = "execution(* com.yourpackage.controller.*.*(..))", throwing = "ex")
10 public void handleControllerExceptions(Exception ex) {
11 // 在这里处理控制器抛出的异常
12 }
13}
4. 在具体Controller中使用@ExceptionHandler
直接在控制器类中使用@ExceptionHandler
注解,处理该控制器内抛出的特定异常。
示例代码:
Java
1@RestController
2public class MyController {
3
4 @ExceptionHandler(value = ResourceNotFoundException.class)
5 public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
6 return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
7 }
8
9 // ...其他方法
10}
通过这些方式,你可以有效地截取并定制Spring框架自动抛出的异常处理逻辑,提供更友好的错误反馈和提升应用的健壮性。