Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: errors, domain, http

Как вернуть доменную ошибку из сервиса и отдать корректный HTTP-код?

Проверяет знание HTTP.

Короткий ответ

Определите доменные ошибки (sentinel или типовые), возвращайте их из сервиса и на уровне HTTP используйте errors.Is/As для маппинга на статусы (например, ErrNotFound → 404, ErrValidation → 400). Не полагайтесь на сравнение строк.

Длинный ответ

Подход:

  • В сервисе — доменные ошибки:

  • sentinel (var ErrNoSlots = errors.New("…"));

  • или типы (type ErrNoSlots struct{ … }) с методами.

  • В хендлере — сопоставление ошибки статусу.

  • Пример:

var (
    ErrNotFound    = errors.New("order not found")
    ErrValidation  = errors.New("validation failed")
    ErrNoSlots     = errors.New("no slots available")
)

func (s *Service) CreateOrder(ctx context.Context, in CreateCmd) (Order, error) {
    if err := validate(in); err != nil {
        return Order{}, fmt.Errorf("%w: %v", ErrValidation, err)
    }
    // ...
    return Order{}, ErrNoSlots
}

// HTTP
if err != nil {
    switch {
    case errors.Is(err, ErrValidation):
        http.Error(w, err.Error(), http.StatusBadRequest)
    case errors.Is(err, ErrNotFound):
        http.Error(w, err.Error(), http.StatusNotFound)
    case errors.Is(err, ErrNoSlots):
        http.Error(w, err.Error(), http.StatusConflict)
    default:
        http.Error(w, "internal error", http.StatusInternalServerError)
    }
    return
}
  • Советы:

  • заворачивайте fmt.Errorf("%w", err) для сохранения цепочки;

  • используйте errors.As для извлечения полей из типовых ошибок.

  • Вывод: чёткий контракт ошибок на уровне сервиса упрощает правильные HTTP-ответы.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Golang

    Golang

  • Networks

Ключевые слова

#errors

#domain

#http

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.