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> {
}