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

Как правильно обрабатывать и логировать ошибки в проекте, содержащем множество REST-контроллеров, каждый из которых отвечает за операции CRUD для различных сущностей?

Ответ от нейросети

sobes.tech AI

Правильная обработка и логирование ошибок в проекте с множеством REST-контроллеров включает следующие практики:

  • Централизованная обработка ошибок: использовать глобальный обработчик исключений (например, @ControllerAdvice в Spring), чтобы не дублировать код в каждом контроллере.
  • Стандартизированный формат ответов об ошибках: возвращать клиенту единый формат с кодом ошибки, сообщением и, при необходимости, деталями.
  • Логирование ошибок с контекстом: записывать в логи не только сообщение об ошибке, но и информацию о запросе, параметрах, пользователе и стеке вызовов.
  • Разделение уровней логирования: например, WARN для ожидаемых ошибок (например, валидация), ERROR для критических исключений.

Пример глобального обработчика в Spring Boot:

@RestControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(EntityNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleNotFound(EntityNotFoundException ex) {
        logger.warn("Entity not found: {}", ex.getMessage());
        return ResponseEntity.status(HttpStatus.NOT_FOUND)
            .body(new ErrorResponse("NOT_FOUND", ex.getMessage()));
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        logger.error("Unexpected error", ex);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body(new ErrorResponse("INTERNAL_ERROR", "Произошла внутренняя ошибка сервера"));
    }
}

class ErrorResponse {
    private String code;
    private String message;

    // конструкторы, геттеры, сеттеры
}

Такой подход упрощает поддержку и улучшает качество логирования и обработки ошибок во всём проекте.