Что делает аннотация @ExceptionHandler в Spring?

«Что делает аннотация @ExceptionHandler в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

@ExceptionHandler — это аннотация Spring MVC, которая помечает метод как обработчик исключений для конкретного контроллера. Она позволяет централизованно обрабатывать исключения, выброшенные в методах этого контроллера, и возвращать кастомный HTTP-ответ.

Пример использования:

@RestController
public class UserController {
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id)
                .orElseThrow(() -> new UserNotFoundException(id));
    }

    @ExceptionHandler(UserNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ErrorResponse handleUserNotFound(UserNotFoundException ex) {
        return new ErrorResponse("User not found", ex.getMessage());
    }
}

Ключевые особенности:

  • Обрабатывает исключения только в пределах контроллера, где объявлен.
  • Может принимать само исключение и другие параметры запроса (например, HttpServletRequest) в качестве аргументов метода.
  • Возвращаемое значение метода формирует тело HTTP-ответа (аналогично @RequestMapping).
  • Для глобальной обработки исключений во всем приложении используется @ControllerAdvice в сочетании с @ExceptionHandler.