0Pricing
C++ Academy · Урок

Шаблоны обработки ошибок

Комбинируйте 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 — локальная установка не требуется.

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

  1. Представление отсутствия с optional
  2. Доступ к значениям optional
  3. Основы std::expected
  4. Шаблоны обработки ошибок
← Назад к C++ Academy