Раздел 41 · Zig с нуля

catch и обработка на месте

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

catch и обработка на месте

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

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

Одна мысль урока

catch выбирает действие на неуспешном пути там, где вызвана функция.

Опора из прошлого урока: Error unions и try.

От картинки к записи

В прошлый раз try передавал ошибку вверх. catch оставляет решение в текущем месте. Запись parse(...) catch 8080 возвращает успешное число либо запасное. Функция снаружи больше не возвращает ошибку: она взяла ответственность за выбор на себя.

Для разбора десятичного числа используем std.fmt.parseInt(u16, text, 10). Первый аргумент задаёт тип результата, второй содержит байты текста, третий основание счисления. Для "9000" результатом будет 9000. Для "abc" возникнет ошибка: эти байты не обозначают цифры в десятичной записи. Значение, не помещающееся в u16, также отвергается.

Оператор может иметь блок: catch |err| { ... }. Между вертикальными чертами появляется имя ошибки. Его можно сравнить или разобрать switch, затем выбрать действие. Если блок должен вернуть значение выражения, используют помеченный блок с break :label value; для первого примера проще обычный return. Не выбирай сложную форму, когда прямой возврат объясняет путь лучше.

Есть разница между двумя договорами. «Если настройка отсутствует, используй 8080» не равно «если настройка написана неверно, используй 8080». Автоматическая замена неверной строки может скрыть опечатку и направить программу не туда. В учебной функции запасное поведение объявлено явно: любой сбой разбора даёт 8080. В настоящем приложении это должно быть сознательное требование, а не способ получить зелёную сборку.

catch не ловит нарушение границ массива или произвольную остановку. Он работает с error union. После раскрытия успешная сторона имеет обычный тип u16, и следующий код уже не обязан снова разбирать тот же результат. Но если обработчик сам выполняет операцию с ошибкой, её тоже нужно отдельно вернуть или обработать.

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

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

премиум-урок

Продолжение в премиуме: 1 200 ₽ в месяц или 10 000 ₽ в год. Вместе с ним серверные проверки задач и школьные токены AI-коуча.

Оплата пока не подключена: премиум и курсы открываются промокодом.