Ошибки и defer в Go: задачи с проверкой кода
Три задачи Go на распространение ошибок и завершение работы: оборачивание с сохранением причины, отложенные вызовы и обработка ошибки в функции с интерфейсными зависимостями. Это практика для тех, кто уже умеет писать функции и читать сигнатуры.
Ошибка как возвращаемое значение
Обычная ошибка в Go передаётся значением error. Проверьте её перед использованием результата. Добавляйте контекст так, чтобы вызывающий код при необходимости мог определить исходную причину: fmt.Errorf с %w сохраняет связь для errors.Is. Простое сравнение текстов сообщений плохо подходит для такого контракта.
Завершение и ранний выход
defer регистрирует вызов до выхода из окружающей функции. Несколько вызовов выполняются в обратном порядке, включая обычный ранний return. Аргументы вычисляются при регистрации defer. Это полезно для освобождения уже полученного ресурса, но не отменяет необходимость проверить, удалось ли его получить.
Ошибки на границе интерфейса
Интерфейс позволяет заменить реальную зависимость учебной реализацией и проверить, как вызывающий код реагирует на ошибку чтения или уведомления. Назовите, какую ошибку нужно вернуть дальше и какие действия после неё выполнять уже нельзя. Не скрывайте исходную ошибку без требования задачи.
Самопроверка
Для каждой функции проверьте успешный путь и предусмотренный условием отказ. В defer-задаче выпишите порядок регистрации и порядок выполнения отдельно. В задании с оборачиванием сравните поведение errors.Is, а не только строку ошибки. Конкретные имена функций и формат результата берите из условия упражнения.
Задачи в подборке
- Go errors.Is и fmt.Errorf с %w: оборачивание ошибок.
- Go defer: обратный порядок вызовов и ранний return.
- Go: композиция интерфейсов ReaderNotifier и обработка ошибки.
Проверка доступна без регистрации. Для сохранения прогресса переходите в соответствующий урок курса. Курс с объяснениями по порядку.
- Go errors.Is и fmt.Errorf с %w: оборачивание ошибок
Проверьте диапазон глубины, оберните сигнальную ошибку с контекстом и сохраните её распознавание через errors.Is.
Golang с нуля - defer в Go: порядок вызовов, аргументы и ранний return
Когда выполняется defer и почему вызовы идут в обратном порядке? Короткий пример Go и задача на завершение этапов.
Golang с нуля - Go: композиция интерфейсов ReaderNotifier и обработка ошибки
Объедините чтение показаний и отправку предупреждений в составном интерфейсе; остановитесь на первой ошибке.
Golang с нуля
