Обработка ошибок

11 вопросов

Go использует явную обработку ошибок через возвращаемые значения вместо исключений. errors.Is, errors.As, оборачивание через %w - ключевые инструменты работы с ошибками.

1 Как правильно обработать ошибку в Go? 🟢 Лёгкий
Ответ: B) if err != nil

Go использует явную обработку ошибок через возвращаемые значения, а не исключения. Идиоматический паттерн: result, err := f(); if err != nil { return err }. Нет try/catch - это сознательное решение дизайнеров Go.

Подробнее →
2 Как создать простую ошибку? 🟢 Лёгкий
Ответ: B) errors.New("msg")

errors.New("сообщение") создаёт новое значение, реализующее интерфейс error. Для форматированных ошибок: fmt.Errorf("ошибка: %v", details). В Go нет конструкций new Error() (JavaScript) или throw (Java).

Подробнее →
3 Какой интерфейс должен реализовать тип, чтобы быть ошибкой? 🟢 Лёгкий
Ответ: B) error (метод Error() string)

Интерфейс error содержит один метод: Error() string. Любой тип с этим методом является ошибкой. Можно создать свой тип ошибки с дополнительными полями.

Подробнее →
4 Зачем объявлять ошибки как var ErrNotFound = errors.New("not found") на уровне пакета? 🟢 Лёгкий
Ответ: B) Чтобы проверять через errors.Is, а не по тексту

Sentinel errors (ошибки-значения) объявляют как переменные пакета, чтобы сравнивать через errors.Is(err, ErrNotFound), а не по тексту. Сравнение по тексту хрупкое - любое изменение сообщения ломает код. errors.Is работает с цепочкой обёрнутых ошибок.

Подробнее →
5 Что делает errors.Is(err, target)? 🟡 Средний
Ответ: B) Проверяет, есть ли target в цепочке ошибок

errors.Is рекурсивно проходит по цепочке обёрнутых ошибок (через Unwrap()) и сравнивает каждую с target. Это надёжнее, чем err == target, потому что работает с обёрнутыми ошибками.

Подробнее →
6 Как обернуть ошибку с контекстом в Go 1.13+? 🟡 Средний
Ответ: B) fmt.Errorf("... %w", err)

Глагол %w в fmt.Errorf оборачивает ошибку, сохраняя цепочку. Обёрнутую ошибку можно проверить через errors.Is и errors.As. Глагол %v только добавляет текст, но теряет связь с оригинальной ошибкой.

Подробнее →
7 Что делает errors.As(err, &target)? 🟡 Средний
Ответ: B) Извлекает ошибку конкретного типа из цепочки

errors.As ищет в цепочке ошибку определённого типа и записывает её в target. Полезно для получения дополнительных данных из кастомных ошибок.

Подробнее →
8 Что делает errors.Join(err1, err2) (Go 1.20+)? 🟡 Средний
Ответ: B) Создаёт ошибку, содержащую обе; errors.Is находит любую

errors.Join объединяет несколько ошибок в одну. Результат содержит все переданные ошибки, и errors.Is/errors.As проверяют каждую из них. Полезно при параллельной обработке, когда нужно собрать ошибки из нескольких горутин.

Подробнее →
9 Какой паттерн рекомендуется для проверки конкретной ошибки в Go? 🟡 Средний
Ответ: B) errors.Is(err, ErrNotFound)

errors.Is проверяет всю цепочку обёрнутых ошибок (unwrap). err == ErrNotFound не работает с обёрнутыми fmt.Errorf("%w", err). Строковое сравнение хрупко - текст может измениться. errors.As - для проверки типа ошибки и извлечения данных из неё.

Подробнее →
10 Что вернёт: err := fmt.Errorf("wrap: %w", os.ErrNotExist); errors.Is(err, os.ErrNotExist)? 🔴 Сложный
Ответ: B) true

Глагол %w оборачивает ошибку, сохраняя цепочку. errors.Is рекурсивно разворачивает обёртки и сравнивает с целевой ошибкой. Обычное == не сработало бы, потому что err - другой объект. errors.Is создан именно для обёрнутых ошибок.

Подробнее →
11 Что делает fmt.Errorf("%w и %w", err1, err2) (Go 1.20+)? 🔴 Сложный
Ответ: B) Оборачивает обе ошибки; errors.Is находит любую из них

Go 1.20 позволяет оборачивать несколько ошибок через несколько %w в fmt.Errorf. Результат реализует interface{ Unwrap() []error }. errors.Is и errors.As проверяют все обёрнутые ошибки.

Подробнее →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.