Шаблоны обработки ошибок
Комбинируйте optional и expected
«Шаблоны обработки ошибок» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Два инструмента, одна цель
std::optional и std::expected заменяют ненадёжные сигнальные значения. В этом уроке показаны способы аккуратно объединять и компоновать их.
Ранний возврат при пустом значении
Простой и понятный шаблон: проверьте необязательное значение и сразу выйдите из функции, если оно пусто, прежде чем продолжать работу.
#include <iostream>
#include <optional>
std::optional<int> parse(bool ok) { return ok ? std::optional<int>(5) : std::nullopt; }
int main() {
auto v = parse(true);
if (!v) { std::cout << "no value\n"; return 0; }
std::cout << *v + 1 << "\n";
}От необязательного значения к ожидаемому результату
Преобразуйте отсутствующее необязательное значение в описанную ошибку, если вызывающему коду нужна причина.
#include <expected>
#include <optional>
#include <string>
std::expected<int, std::string> require(std::optional<int> o) {
if (o) return *o;
return std::unexpected("value missing");
}
int main() {}Цепочка с помощью value_or
Когда несколько операций поиска участвуют в формировании одного результата, value_or позволяет указать значения по умолчанию непосредственно в выражении, без вложенных условных операторов.
#include <iostream>
#include <optional>
int setting(std::optional<int> user, int fallback) {
return user.value_or(fallback);
}
int main() {
std::cout << setting(std::nullopt, 42) << "\n";
}Передача ошибок на верхний уровень
С помощью std::expected функция может проверить результат вложенного вызова и передать его ошибку без изменений, формируя конвейер обработки ошибок.
#include <expected>
#include <string>
using R = std::expected<int, std::string>;
R step1(bool ok) { return ok ? R(2) : R(std::unexpected("step1 failed")); }
R run(bool ok) {
auto r = step1(ok);
if (!r) return std::unexpected(r.error());
return *r * 10;
}
int main() {}Монадное связывание and_then
В C++23 and_then объединяет в цепочку операции, каждая из которых возвращает необязательное значение или ожидаемый результат, и прекращает выполнение при первом сбое — без ручной каскадной проверки условий.
Преобразование с помощью transform
transform применяет обычную функцию к успешному значению, оставляя ошибки и отсутствие значения без изменений и преобразуя только успешный путь.
Восстановление с помощью or_else
or_else запускает резервный вариант, который может предоставить заменяющее значение или альтернативную ошибку, если исходное значение отсутствует или операция завершилась с ошибкой.
Выбор между ними
Используйте необязательное значение, когда отсутствие не требует объяснений, например при отсутствии записи в кэше. Используйте ожидаемый результат, когда вызывающий код должен различать причины сбоя, например ошибки разбора и ошибки доступа.
Не смешивайте сигнальные значения
Не смешивайте старые коды ошибок с необязательными и ожидаемыми значениями в одном API. Выберите одну последовательную стратегию, чтобы вызывающий код единообразно обрабатывал сбои.
Используйте типизированные ошибки
Если ошибки проверяются программно, предпочитайте перечисление или небольшую структуру вместо обычных строк; строки лучше подходят для сообщений, предназначенных пользователю.
Быстрая проверка
Проверьте своё понимание шаблонов обработки ошибок.
Повторение
Вы узнали о шаблонах обработки ошибок:
- Ранний возврат при пустом значении или ошибке сохраняет плоскую структуру кода.
- Преобразуйте необязательное значение в ожидаемый результат, когда нужна причина.
- Составляйте цепочки с помощью
and_then,transformиor_else(C++23). - Соблюдайте последовательность и не смешивайте сигнальные значения с необязательными и ожидаемыми.
Часто задаваемые вопросы
Урок «Шаблоны обработки ошибок» бесплатный?
Да — полный текст урока «Шаблоны обработки ошибок» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Шаблоны обработки ошибок»?
Комбинируйте optional и expected Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Шаблоны обработки ошибок»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Представление отсутствия с optional
- Доступ к значениям optional
- Основы std::expected
- Шаблоны обработки ошибок