0Pricing
C++ Academy · Урок

try, catch, throw

Обрабатывайте ошибки с помощью исключений

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

Сигнализация об ошибках с помощью исключений

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

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::runtime_error("boom");
    } catch (const std::exception& e) {
        std::cout << e.what() << "\n";
    }
}

Попытка и обработка исключений

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

#include <iostream>
#include <stdexcept>

int divide(int a, int b) {
    if (b == 0) throw std::invalid_argument("divide by zero");
    return a / b;
}

int main() {
    try {
        std::cout << divide(10, 0) << "\n";
    } catch (const std::invalid_argument& e) {
        std::cout << "error: " << e.what() << "\n";
    }
}

Перехватывайте по константной ссылке

Всегда перехватывайте исключения с помощью const&. Перехват по значению обрезает производные исключения и без необходимости создаёт копии.

Несколько блоков обработки

Перечисляйте обработчики от наиболее конкретного к наиболее общему. Выполняется первый подходящий блок.

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::out_of_range("bad index");
    } catch (const std::out_of_range& e) {
        std::cout << "range: " << e.what() << "\n";
    } catch (const std::exception& e) {
        std::cout << "other: " << e.what() << "\n";
    }
}

Раскрутка стека

При возбуждении исключения стек раскручивается: каждый локальный объект между местом возбуждения и обработчиком уничтожается в обратном порядке.

#include <iostream>
#include <stdexcept>

struct Trace {
    ~Trace() { std::cout << "unwound\n"; }
};

void f() {
    Trace t;
    throw std::runtime_error("x");
}

int main() {
    try { f(); } catch (...) { std::cout << "caught\n"; }
}

Универсальный обработчик

Блок catch (...) перехватывает исключение любого типа. Используйте его экономно — обычно для записи в журнал и повторного возбуждения исключения.

Повторное возбуждение исключения

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

#include <iostream>
#include <stdexcept>

void inner() { throw std::runtime_error("deep"); }

void middle() {
    try { inner(); }
    catch (...) { std::cout << "logged\n"; throw; }   // rethrow
}

int main() {
    try { middle(); } catch (const std::exception& e) { std::cout << e.what() << "\n"; }
}

Стандартная иерархия исключений

Большинство стандартных исключений производны от std::exception, который предоставляет what(). Перехват std::exception обрабатывает их все.

Возбуждайте по значению, перехватывайте по ссылке

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

Исключения и коды ошибок

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

Неперехваченные исключения завершают программу

Если ни один обработчик не подходит, вызывается std::terminate, и программа аварийно завершается. Всегда обрабатывайте ожидаемые исключения.

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

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

Итоги

Вы научились возбуждать ошибки с помощью throw, обрабатывать их с помощью try/catch и узнали, как раскрутка стека уничтожает локальные объекты. Перехватывайте по const&, располагайте обработчики от конкретного к общему и повторно возбуждайте исключение с помощью отдельной инструкции throw;.

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

Урок «try, catch, throw» бесплатный?

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

Чему я научусь в уроке «try, catch, throw»?

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

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

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

Сколько времени занимает урок «try, catch, throw»?

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

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

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

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

  1. try, catch, throw
  2. Безопасность исключений
  3. Спецификатор noexcept
  4. Пользовательские типы исключений
← Назад к C++ Academy