Spring Boot 如何使用 @ExceptionHandler 注解进行局部异常处理
在 Web 应用程序中,异常处理是非常重要的一部分。在 Spring Boot 中,可以使用 @ExceptionHandler 注解来处理控制器中的异常。本文将介绍如何使用 @ExceptionHandler 注解进行局部异常处理,并提供一些示例代码来帮助您更好地理解。
@ExceptionHandler 注解简介
@ExceptionHandler 注解是 Spring MVC 框架提供的一种异常处理机制。当控制器中抛出指定类型的异常时,Spring MVC 会自动调用使用 @ExceptionHandler 注解标记的方法来处理异常。
例如,以下代码演示了如何使用 @ExceptionHandler 注解来处理 NumberFormatException 异常:
@RestController public class DemoController { @GetMapping("/test") public String test(@RequestParam("number") String number) { Integer.parseInt(number); return "success"; } @ExceptionHandler(NumberFormatException.class) public ResponseEntity<String> handleNumberFormatException(NumberFormatException ex) { return ResponseEntity.badRequest().body("Invalid number format"); } }
在上面的代码中,我们定义了一个名为 DemoController 的控制器,并在其中提供了一个名为 test 的方法,用于将字符串转换为整数。如果字符串格式不正确,则会抛出 NumberFormatException 异常。我们还定义了一个名为 handleNumberFormatException 的方法,并使用 @ExceptionHandler 注解来处理 NumberFormatException 异常。如果控制器中抛出 NumberFormatException 异常,则会调用该方法来处理异常,并返回一个 HTTP 400 错误响应。
局部异常处理
在 Spring Boot 中,可以在控制器的方法上使用 @ExceptionHandler 注解来实现局部异常处理。这意味着您可以为每个方法定义自己的异常处理逻辑。
例如,以下代码演示了如何在控制器的方法上使用 @ExceptionHandler 注解来处理 UserNotFoundException 异常:
@RestController public class DemoController { @GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { User user = userRepository.findById(id) .orElseThrow(() -> new UserNotFoundException(id)); return user; } @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage()); } }
在上面的代码中,我们定义了一个名为 getUser 的方法,并使用 @PathVariable 注解将 URL 中的参数映射到方法的参数中。如果找不到指定 ID 的用户,则会抛出 UserNotFoundException 异常。我们还定义了一个名为 handleUserNotFoundException 的方法,并使用 @ExceptionHandler 注解来处理 UserNotFoundException 异常。如果控制器中抛出 UserNotFoundException 异常,则会调用该方法来处理异常,并返回一个 HTTP 404 错误响应。
总结
在本文中,我们介绍了如何使用 @ExceptionHandler 注解进行局部异常处理,并提供了一些示例代码来帮助您更好地理解。使用 @ExceptionHandler 注解可以为每个方法定义自己的异常处理逻辑,使代码更加清晰和可维护。希望这篇文章对您有所帮助,谢谢阅读!
以下是完整的示例代码:
@RestController public class DemoController { @GetMapping("/test") public String test(@RequestParam("number") String number) { Integer.parseInt(number); return "success"; } @ExceptionHandler(NumberFormatException.class) public ResponseEntity<String> handleNumberFormatException(NumberFormatException ex) { return ResponseEntity.badRequest().body("Invalid number format"); } @GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { User user = userRepository.findById(id) .orElseThrow(() -> new UserNotFoundException(id)); return user; } @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage()); } } @ResponseStatus(HttpStatus.NOT_FOUND) public class UserNotFoundException extends RuntimeException { public UserNotFoundException(Long id) { super("User not found with id:" + id); } } @Repository public interface UserRepository extends JpaRepository<User, Long> { }