购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.5.1 全局异常处理

随着应用程序的复杂性增加,有效和一致的错误及异常处理变得至关重要。你是否曾经遇到过这样的情况:用户在相同的页面或功能中遇到问题,却收到了不一致的错误提示;或者,在应用的某些部分,故障信息过于技术化,而其他部分又过于模糊。这种不一致性可能导致用户感到困惑,并对应用程序的可靠性产生质疑。

全局异常处理是确保无论在应用程序的哪个部分遇到问题,都能以一致、清晰的方式向用户反馈的关键机制。这一机制允许我们在一个集中的位置处理所有的异常,确保整体的用户体验和应用的响应行为始终如一。

在Spring Boot中,全局异常处理通常是通过使用@ControllerAdvice或@RestControllerAdvice和@ExceptionHandler注解来实现的。@RestControllerAdvice是@ControllerAdvice的特殊变种,它默认将结果作为JSON返回,非常适合RESTful服务。

@ControllerAdvice与@RestControllerAdvice允许你为多个@Controller或@RestController类定义全局、跨切面的行为,它们不直接处理HTTP请求,而是提供一个机制来影响或修改其他控制器的行为,它的功能影响所有控制器,除非你特别指定了一组控制器或包。

当你需要定义一些对多个控制器都适用的行为时,例如,当多个控制器都需要相同的异常处理逻辑时,@ControllerAdvice与@RestControllerAdvice是最合适的选择。

@ExceptionHandler用于处理控制器中的特定异常,这个注解提供了一种优雅的方式来集中处理特定的异常类型,而不是在每个控制器方法中使用try-catch块。

你可以在控制器中定义一个或多个方法,并使用@ExceptionHandler注解来指定这些方法应处理的异常类型,例如:

    @RestController
    @RequestMapping("/api")
    public class MyRestController {
 
       @GetMapping("/some-endpoint")
       public ResponseEntity<String> someEndpoint() {
           // 可能抛出CustomException的代码
           return ResponseEntity.ok("成功响应");
       }
 
       @ExceptionHandler(CustomException.class)
       public ResponseEntity<String> handleCustomException(CustomException ex) {
           // 自定义异常的处理
           return
    ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
       }
    }

在上面的示例中,如果someEndpoint()方法抛出CustomException,则handleCustomException()方法将被调用来处理该异常,并返回一个包含错误消息的BAD_REQUEST响应。

当与@RestControllerAdvice结合使用时,@ExceptionHandler注解可以为多个REST控制器提供全局的异常处理,例如:

    @ControllerAdvice
    public class GlobalExceptionHandler {
 
       @ExceptionHandler(CustomException.class)
       public ResponseEntity<String> handleCustomException(CustomException ex) {
           return ResponseEntity.status(HttpStatus.BAD_REQUEST).body
    (ex.getMessage());
       }
    }

上述GlobalExceptionHandler类定义了一个全局异常处理器,它会处理所有控制器中抛出的CustomException,可以单独在demo项目的根包(com.example.demo)下创建advice包,将advice相关的类统一存放在此包中。 5vWxkVIq4OsT18AqwGTBtcTzGhwiHSXXf4gTcXJh6D1//pq/vmiotVYlgZQYpxvD

点击中间区域
呼出菜单
上一章
目录
下一章
×