Назад к вопросам
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;
// конструкторы, геттеры, сеттеры
}
Такой подход упрощает поддержку и улучшает качество логирования и обработки ошибок во всём проекте.