atomic-sentinel-errors-go.md 1.3 KB

Sentinel-err-паттерн в Go

Контекст: В сервисах places.go использовался fmt.Errorf("not your place"), что не позволяло проверить тип ошибки через errors.Is().

Суть: Sentinel errors — это именованные переменные-ошибки на уровне пакета, которые позволяют вызывающему коду проверять причину ошибки без парсинга строки.

var (
    ErrNotYourPlace = errors.New("not your place")
    ErrPlaceNotFound = errors.New("place not found")
)

// Использование:
if !isModerator && place.OwnerID != input.OwnerID {
    return nil, fmt.Errorf("%w: user %s tried to update place %s",
        ErrNotYourPlace, input.OwnerID, input.ID)
}

// Проверка:
if errors.Is(err, ErrNotYourPlace) {
    // вернуть 403
}

Плюсы:

  • errors.Is() работает стабильно
  • Можно добавить контекст через %w
  • Самодокументируемый код

Связанные заметки: [[backend-auth-security]], [[backend-validation]] Источник: Code review: P0 fix в services/places.go

#golang #backend #best-practice #error-handling