errdefer для очистки после сбоя
Отменяйте выполненную работу только при сбое.
«errdefer для очистки после сбоя» — бесплатный урок Zig Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Zig Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Zig Academy содержит 4 уроков всего.
Очистка только при сбое
Иногда при сбое операции нужно отменить выполненную работу, но сохранить её при успехе. Именно для этого случая предназначен errdefer.
Знакомство с errdefer
Конструкция errdefer планирует выполнение кода при выходе из области видимости, но только если функция возвращает ошибку, возникшую после этой точки.
errdefer allocator.free(buffer);defer — всегда, errdefer — при ошибке
defer выполняется независимо от того, как завершается область видимости. errdefer выполняется только на пути ошибки, поэтому при успехе пропускается полностью.
Освобождение частично созданного результата
Выделите память, а затем добавьте errdefer для освобождения. Если следующий шаг завершится ошибкой, буфер будет освобождён; если все шаги пройдут успешно, вы сохраните его и вернёте.
const buf = try allocator.alloc(u8, n);
errdefer allocator.free(buf);
try fill(buf);Порядок отражает выделение
Размещайте каждый errdefer сразу после соответствующего получения ресурса. При сбое они выполняются в обратном порядке, безопасно освобождая ресурсы.
const a = try open();
errdefer a.close();
const b = try open();
errdefer b.close();При успехе выполненная работа сохраняется
Когда функция возвращает значение, а не ошибку, каждый errdefer пропускается. Вызывающий код получает полностью созданный результат.
return buf;Важна точка активации
errdefer защищает только от ошибок, возникших после его регистрации. Ошибки до этой строки не могут его запустить, поэтому размещайте его как можно раньше.
Получение ошибки
В errdefer можно захватить ошибку, чтобы проверить её во время очистки, например записать в журнал, какой сбой вызвал откат.
errdefer |e| std.debug.print("failed: {}\n", .{e});Создание конструкторов без утечек
Функции, которые выделяют память и затем могут завершиться ошибкой, используют errdefer, чтобы не допускать утечек. Частично выполненная работа автоматически отменяется при любой ошибке.
Объединение с try
Каждый try может досрочно завершить выполнение при ошибке. Если errdefer уже зарегистрирован, такой выход всё равно сначала запускает очистку.
const x = try step();
errdefer rollback(x);
_ = try next(x);Подходящий инструмент для отката
Используйте errdefer, когда очистка должна выполняться только при возникновении проблем. Он превращает управление ресурсами на пути ошибки в одну понятную строку.
Быстрая проверка
Вы выделили буфер, но следующий шаг может завершиться ошибкой. Вы хотите освобождать его только при сбое. Что следует использовать?
Итоги
Вы использовали errdefer, чтобы отменить частично выполненную работу на пути ошибки, размещали его сразу после получения каждого ресурса и сохраняли успешные результаты. ✅
Изучай Zig с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «errdefer для очистки после сбоя» бесплатный?
Да — полный текст урока «errdefer для очистки после сбоя» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Zig Academy, подпишись на CoddyKit PRO. Курс Zig Academy содержит 4 уроков всего.
Чему я научусь в уроке «errdefer для очистки после сбоя»?
Отменяйте выполненную работу только при сбое. Ты практикуешь Zig Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Zig Academy?
Предыдущий опыт не требуется. Zig Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «errdefer для очистки после сбоя»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Zig Academy?
Да. Каждый урок Zig Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Восстановление с помощью catch
- Переключение по конкретным ошибкам
- errdefer для очистки после сбоя
- Оборачивание и повторный выброс ошибок