Sobes.tech
Junior — Middle

Πώς πρέπει να χειριζόμαστε και να καταγράφουμε σωστά τα σφάλματα σε ένα έργο που περιέχει πολλαπλούς ελεγκτές REST, καθένας από τους οποίους είναι υπεύθυνος για λειτουργίες CRUD για διαφορετικές οντότητες;

sobes.tech AI

Απάντηση από 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;

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

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