0Pricing
Zig Academy · Урок

defer и errdefer на практике

Выбирайте выполнение всегда или только при ошибке.

«defer и errdefer на практике» — бесплатный урок Zig Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Zig Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Zig Academy содержит 4 уроков всего.

Два ключевых слова для очистки

Zig предоставляет два инструмента планирования: defer выполняется всегда, а errdefer — только если область видимости завершается с ошибкой.

defer означает «всегда»

Используйте defer, когда очистка должна произойти при любых обстоятельствах, например при закрытии файла, открытого на всё время функции.

const f = try open();
defer f.close();

errdefer означает «при ошибке»

errdefer запускается только при выходе из области видимости через ошибку. При успешном возврате он молча пропускается.

const buf = try alloc();
errdefer free(buf);

Почему он пропускается при успехе

Иногда Вы создаёте значение, чтобы его вернуть. При успехе оно принадлежит вызывающему коду, поэтому освобождать его нельзя; errdefer учитывает это.

Частично созданные объекты

errdefer особенно полезен в конструкторах. Если последующий шаг завершается ошибкой, он отменяет предыдущие выделения и не допускает утечки частично созданного объекта.

const a = try alloc();
errdefer free(a);
const b = try alloc();

При успехе владение передаётся

Когда каждый шаг завершается успешно, функция возвращает значение, а errdefer не выполняются. Владение аккуратно передаётся вызывающему коду.

return MyType{ .a = a, .b = b };

Они хорошо сочетаются

Вы можете использовать оба средства. defer обрабатывает временную рабочую память, а errdefer защищает результат, который Вы планируете вернуть.

Оба соблюдают обратный порядок

Как и defer, несколько errdefer разматываются в обратном порядке. При ошибке Zig выполняет соответствующие defer и errdefer вместе, начиная с самых новых.

Размещение имеет значение

Размещайте каждый errdefer сразу после защищаемого им шага. Он защищает только от ошибок, произошедших после достижения его строки.

Простое правило

Задайте один вопрос: должна ли эта очистка выполняться и при успехе? Если да — defer; только при ошибке — errdefer.

Отсутствие утечек по построению

Вместе эти ключевые слова позволяют писать функции без утечек на любом пути — успешном или ошибочном — без ручного учёта.

Быстрая проверка

Когда errdefer выполняется по сравнению с defer?

Итоги

Используйте defer, когда очистка должна выполняться всегда, а errdefer — когда она должна отменять работу только на пути ошибки. ✅

Часто задаваемые вопросы

Урок «defer и errdefer на практике» бесплатный?

Да — полный текст урока «defer и errdefer на практике» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Zig Academy, подпишись на CoddyKit PRO. Курс Zig Academy содержит 4 уроков всего.

Чему я научусь в уроке «defer и errdefer на практике»?

Выбирайте выполнение всегда или только при ошибке. Ты практикуешь Zig Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Zig Academy?

Предыдущий опыт не требуется. Zig Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «defer и errdefer на практике»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Zig Academy?

Да. Каждый урок Zig Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Гарантии defer
  2. Порядок выполнения нескольких defer
  3. defer и errdefer на практике
  4. Сочетание открытия и закрытия
← Назад к Zig Academy