Какими методами в Spring можно реализовать обработку исключительных ситуаций?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
В Spring обработку исключений обычно строят на уровне контроллеров и глобально для всего приложения. Основные инструменты — @ExceptionHandler, @ControllerAdvice / @RestControllerAdvice, а также ResponseStatusException и @ResponseStatus. Важно показать, что известные ошибки переводятся в понятный HTTP-ответ, а не “падают” наружу.
Определение:
Spring предлагает несколько способов перехватывать и преобразовывать исключения в корректные ответы для клиента.
@ExceptionHandler обрабатывает ошибки внутри конкретного контроллера или в отдельном классе-советнике.
@ControllerAdvice и @RestControllerAdvice позволяют вынести общую обработку исключений на уровень всего приложения.
@ResponseStatus задаёт фиксированный HTTP-статус для конкретного исключения, а ResponseStatusException удобно использовать, когда статус нужно выбросить прямо из кода.
Пример использования:
Допустим, при поиске пользователя по id запись не найдена. Тогда сервис выбрасывает исключение, а REST-слой возвращает 404 Not Found с понятным сообщением.
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public UserDto getById(@PathVariable Long id) {
return userService.findById(id)
.orElseThrow(() -> new UserNotFoundException("User not found: " + id));
}
}
@ResponseStatus(HttpStatus.NOT_FOUND)
class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
@RestControllerAdvice
class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleAny(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Unexpected error: " + ex.getMessage());
}
}
Пояснение кода:
- В контроллере метод
getByIdпытается найти пользователя. - Если пользователя нет, выбрасывается
UserNotFoundException. - Аннотация
@ResponseStatus(HttpStatus.NOT_FOUND)автоматически связывает это исключение со статусом404. - Если возникает другое необработанное исключение, его перехватит глобальный обработчик в
@RestControllerAdvice. - Метод с
@ExceptionHandlerформирует HTTP-ответ вручную черезResponseEntity.
Ключевые моменты:
@ExceptionHandlerподходит для точечной обработки ошибок в одном контроллере или в общем обработчике.@ControllerAdvice/@RestControllerAdvice— основной способ централизовать обработку исключений.@ResponseStatusудобно использовать для собственных исключений с фиксированным HTTP-статусом.ResponseStatusExceptionполезен, когда статус нужно выбросить без создания отдельного класса исключения.- Для REST API важно возвращать не stack trace, а понятный статус и сообщение.
- Часто делают отдельные обработчики для бизнес-ошибок, валидации и непредвиденных исключений.