0Pricing
Zig Academy · Урок

Оборачивание и повторный выброс ошибок

Добавляйте контекст по мере передачи ошибок выше.

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

Ошибки передаются вверх

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

Повторный выброс с помощью try

Простейший способ повторно выбросить ошибку — использовать try. Он передаёт исходную ошибку вызывающему коду без изменений, поэтому то же значение продолжает подниматься вверх.

const data = try readFile(path);

Перехватите, затем верните

Чтобы преобразовать ошибку, перехватите её с помощью catch и верните другую. Так низкоуровневая ошибка заменяется ошибкой, подходящей вашему API.

const f = open(path) catch return error.ConfigMissing;

Сопоставляйте ошибки с помощью switch

Объедините catch с switch, чтобы сопоставить каждую исходную ошибку с более понятной, передавая остальные без изменений.

parse(s) catch |e| switch (e) {
    error.Empty => return error.NoInput,
    else => return e,
};

В Zig нет трассировок стека в значениях

Ошибка в Zig — это всего лишь метка, а не объект с контекстом. Чтобы добавить подробности, повторно выбросьте более описательную ошибку, созданную вами.

Добавляйте контекст отдельно

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

open(path) catch |e| {
    std.log.err("open {s}: {}", .{ path, e });
    return error.LoadFailed;
};

Расширяйте набор ошибок

Если вы возвращаете новую ошибку, набор ошибок вашей функции должен включать её. Выводимый набор !T расширяется, чтобы охватить всё, что вы возвращаете.

fn load() !Config {
    return open(".cfg") catch error.LoadFailed;
}

Сохранить или заменить

Принимайте решение на каждом уровне: передавайте точную ошибку с помощью try или заменяйте её ошибкой, которая понятнее вызывающему коду. Оба варианта допустимы.

Сохраняйте границы чистыми

На границе модуля сопоставляйте внутренние ошибки с небольшим публичным набором. Тогда вызывающий код зависит от стабильных имён, а не от внутреннего устройства.

Объединение с errdefer

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

Содержательные сбои

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

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

Вы хотите заменить низкоуровневую ошибку error.NotFound собственной ошибкой error.ConfigMissing для вызывающего кода. Какой вариант работает?

Итоги

Вы повторно выбрасывали ошибки с помощью try, сопоставляли их через catch и switch, записывали контекст в журнал и расширяли наборы ошибок, чтобы сбои оставались содержательными. ✅

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

Урок «Оборачивание и повторный выброс ошибок» бесплатный?

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

Чему я научусь в уроке «Оборачивание и повторный выброс ошибок»?

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

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

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

Сколько времени занимает урок «Оборачивание и повторный выброс ошибок»?

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

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

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

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

  1. Восстановление с помощью catch
  2. Переключение по конкретным ошибкам
  3. errdefer для очистки после сбоя
  4. Оборачивание и повторный выброс ошибок
← Назад к Zig Academy