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`
