Вступить в клуб →
средняявопросОсновы Go: типы, ошибки, интерфейсы

errors.Is не находит sentinel-ошибку после форматирования

В репозитории объявлена ошибка-маркер, а хендлер по ней решает, отдавать ли 404:

var ErrNotFound = errors.New("not found")

func (r *Repo) GetUser(id int64) (*User, error) {
    // ...
    return nil, fmt.Errorf("get user %d: %v", id, ErrNotFound)
}

// в хендлере
if errors.Is(err, ErrNotFound) {
    writeStatus(w, http.StatusNotFound)
    return
}

Клиенты вместо 404 получают 500. Что здесь происходит?

  • `errors.Is` работает только с собственными типами ошибок, здесь нужен `errors.As`
  • Сравнение не сработает, потому что `ErrNotFound` объявлена в другом пакете
  • Проблема в возврате `nil` первым значением — из-за этого ошибка теряется
  • Глагол `%v` подставляет только текст ошибки и не сохраняет цепочку — нужен `%w`

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела