Spring MVC 中,处置惩罚异常的 6种方式

打印 上一主题 下一主题

主题 1961|帖子 1961|积分 5883

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
异常处置惩罚是每个 Java步伐员需要面临的一个问题,在Spring中,提供了多种机制来处置惩罚控制器抛出的异常,确保应用步伐在面临各种错误情况时能够优雅地响应。这篇文章,我们来详细分析Spring MVC中,几种优雅处置惩罚异常的方式。
1. 利用@ExceptionHandler注解

@ExceptionHandler注解允许在单个Controller中界说处置惩罚特定异常的方法。当 Controller的方法抛出指定的异常时,Spring会调用相应的处置惩罚方法。
如下示例,展示了如何在 Controller层优雅处置惩罚异常:
  1. @Controller
  2. public class MyController {
  3.     @RequestMapping("/example")
  4.     public String example() {
  5.         // 可能抛出异常的业务逻辑
  6.         if (1/0) {
  7.             throw new CustomException("自定义异常发生");
  8.         }
  9.         return "success";
  10.     }
  11.     @ExceptionHandler(CustomException.class)
  12.     public ModelAndView handleCustomException(CustomException ex) {
  13.         ModelAndView mav = new ModelAndView();
  14.         mav.addObject("message", ex.getMessage());
  15.         mav.setViewName("errorPage");
  16.         return mav;
  17.     }
  18. }
复制代码
优点: 简朴直观,实用于单个控制器的异常处置惩罚。
缺点: 假如多个控制器需要相同的异常处置惩罚逻辑,需要在每个控制器中重复界说。
2. 利用@ControllerAdvice注解

@ControllerAdvice是一种全局的异常处置惩罚方式,可以应用于所有 Controller。通过将异常处置惩罚逻辑集中在一个地方,可以避免代码重复,提高维护性。
如下示例,展示了如何利用 @ControllerAdvice 优雅处置惩罚全局异常:
  1. @ControllerAdvice
  2. public class GlobalExceptionHandler {
  3.     @ExceptionHandler(CustomException.class)
  4.     public ModelAndView handleCustomException(CustomException ex) {
  5.         ModelAndView mav = new ModelAndView();
  6.         mav.addObject("message", ex.getMessage());
  7.         mav.setViewName("errorPage");
  8.         return mav;
  9.     }
  10.     @ExceptionHandler(Exception.class)
  11.     public ModelAndView handleGeneralException(Exception ex) {
  12.         ModelAndView mav = new ModelAndView();
  13.         mav.addObject("message", "发生了一个错误: " + ex.getMessage());
  14.         mav.setViewName("errorPage");
  15.         return mav;
  16.     }
  17. }
复制代码
优点:


  • 全局同一管理异常处置惩罚逻辑。
  • 代码更清晰,易于维护。
缺点:


  • 全局处置惩罚不实用于需要针对某些控制器有特殊处置惩罚需求的情况,需结合其他方法利用。
3. 实现HandlerExceptionResolver接口

HandlerExceptionResolver 是一种更底层的异常处置惩罚机制,通过实现该接口,开发者可以自界说异常解析逻辑。
如下示例,展示了如何实现 HandlerExceptionResolver接口优雅处置惩罚异常:
  1. public class MyExceptionResolver implements HandlerExceptionResolver {
  2.     @Override
  3.     public ModelAndView resolveException(HttpServletRequest request,
  4.                                          HttpServletResponse response,
  5.                                          Object handler,
  6.                                          Exception ex) {
  7.         ModelAndView mav = new ModelAndView();
  8.         if (ex instanceof CustomException) {
  9.             mav.addObject("message", ex.getMessage());
  10.             mav.setViewName("customErrorPage");
  11.         } else {
  12.             mav.addObject("message", "未知错误");
  13.             mav.setViewName("errorPage");
  14.         }
  15.         return mav;
  16.     }
  17. }
复制代码
配置
在 Spring 配置文件中注册自界说异常解析器:
  1. <bean class="com.example.MyExceptionResolver"/>
复制代码
优点


  • 高度灵活,可以处置惩罚各种复杂的异常景象。
缺点


  • 需要更多的配置和实现工作。
  • 不如注解方式直观,实用性较低。
4. 利用@ResponseStatus注解

@ResponseStatus注解可以用于自界说异常对应的 HTTP 状态码和错误信息,当抛出带有该注解的异常时,Spring会自动设置相应的状态码。
如下示例,展示了如何利用 @ResponseStatus注解优雅处置惩罚异常:
  1. @ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "资源未找到")
  2. public class ResourceNotFoundException extends RuntimeException {
  3.     public ResourceNotFoundException(String message) {
  4.         super(message);
  5.     }
  6. }
复制代码
利用:
  1. @Controller
  2. public class MyController {
  3.     @RequestMapping("/resource")
  4.     public String getResource() {
  5.         // 假设资源未找到
  6.         throw new ResourceNotFoundException("资源ID不存在");
  7.     }
  8. }
复制代码
优点:


  • 简朴快捷,实用于直接映射到特定 HTTP 状态码的异常情况。
缺点:


  • 无法返回自界说的错误页面或更复杂的错误信息。
5. 利用ResponseEntity和@RestControllerAdvice

在构建 RESTful API时,常用ResponseEntity来返回自界说的错误响应,并结合 @RestControllerAdvice可以全局处置惩罚异常并返回 JSON 格式的错误信息。
如下示例,展示了如何利用ResponseEntity和*@RestControllerAdvice*来处置惩罚 RESTful API的异常:
  1. @RestControllerAdvice
  2. public class RestExceptionHandler {
  3.     @ExceptionHandler(CustomException.class)
  4.     public ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) {
  5.         ErrorResponse error = new ErrorResponse("CUSTOM_ERROR", ex.getMessage());
  6.         return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
  7.     }
  8.     @ExceptionHandler(Exception.class)
  9.     public ResponseEntity<ErrorResponse> handleGeneralException(Exception ex) {
  10.         ErrorResponse error = new ErrorResponse("GENERAL_ERROR", "内部服务器错误");
  11.         return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
  12.     }
  13. }
  14. public class ErrorResponse {
  15.     private String errorCode;
  16.     private String errorMessage;
  17.     // 构造方法、getter 和 setter
  18. }
复制代码
优点


  • 实用于 RESTful 服务,能够返回结构化的错误信息(如 JSON)。
  • 全局同一管理,易于维护。
缺点


  • 需要界说额外的错误响应类。
6. 利用@ControllerAdvice和@ExceptionHandler

假如利用 Spring Boot,可以更便捷地利用 @ControllerAdvice 结合自动配置实现异常处置惩罚。
如下示例,展示了如何利用 @ControllerAdvice@ExceptionHandler来处置惩罚异常:
  1. @RestControllerAdvice
  2. public class GlobalExceptionHandler {
  3.     @ExceptionHandler(MethodArgumentNotValidException.class)
  4.     public ResponseEntity<ValidationErrorResponse> handleValidationExceptions(
  5.             MethodArgumentNotValidException ex) {
  6.         ValidationErrorResponse errors = new ValidationErrorResponse();
  7.         ex.getBindingResult().getAllErrors().forEach((error) -> {
  8.             errors.addError(((FieldError) error).getField(), error.getDefaultMessage());
  9.         });
  10.         return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
  11.     }
  12.     // 其它异常处理方法
  13. }
复制代码
优点


  • 与 Spring Boot 无缝集成,减少配置。
  • 提供了诸多便利的功能,如自动处置惩罚验证错误等。
7. 总结

本文,我们分析了 Spring MVC优雅处置惩罚异常的几种方法以及代码示例,我们可以根据详细需求选择合适的方法:


  • 局部控制器处置惩罚:利用 @ExceptionHandler 注解,实用于单个控制器的特定异常处置惩罚。
  • 全局处置惩罚:利用 @ControllerAdvice@RestControllerAdvice,实用于跨多个控制器的同一异常处置惩罚。
  • 自界说解析:实现 HandlerExceptionResolver 接口,实用于需要高度自界说的异常处置惩罚逻辑。
  • 状态码注解:利用 @ResponseStatus 注解,实用于简朴的异常状态码映射。
  • RESTful API:结合 ResponseEntity 和全局异常处置惩罚,返回结构化的错误响应。
从实际工作来看,@ControllerAdvice@RestControllerAdvice是利用频率最高的一种方式。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表