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;

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

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