Sobes.tech
Назад к вопросам
Junior — Middle
82

Какими методами в 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());
    }
}

Пояснение кода:

  1. В контроллере метод getById пытается найти пользователя.
  2. Если пользователя нет, выбрасывается UserNotFoundException.
  3. Аннотация @ResponseStatus(HttpStatus.NOT_FOUND) автоматически связывает это исключение со статусом 404.
  4. Если возникает другое необработанное исключение, его перехватит глобальный обработчик в @RestControllerAdvice.
  5. Метод с @ExceptionHandler формирует HTTP-ответ вручную через ResponseEntity.

Ключевые моменты:

  • @ExceptionHandler подходит для точечной обработки ошибок в одном контроллере или в общем обработчике.
  • @ControllerAdvice / @RestControllerAdvice — основной способ централизовать обработку исключений.
  • @ResponseStatus удобно использовать для собственных исключений с фиксированным HTTP-статусом.
  • ResponseStatusException полезен, когда статус нужно выбросить без создания отдельного класса исключения.
  • Для REST API важно возвращать не stack trace, а понятный статус и сообщение.
  • Часто делают отдельные обработчики для бизнес-ошибок, валидации и непредвиденных исключений.