Назад к вопросам
Junior
83
questionbank

Что такое исключения в C++?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Ключевые слова:

  • try: Определяет блок кода, в котором могут произойти исключения.
  • catch: Определяет блок кода, выполняющийся при возникновении определенного типа исключения.
  • throw: Генерирует (создает) исключение. Тип исключения может быть любым объектом.

Принцип работы:

  1. Код, который может вызвать ошибку, помещается в блок try.
  2. Если в блоке try возникает исключение (генерируется с помощью throw), обычное выполнение программы прерывается.
  3. Система ищет подходящий блок catch, способный обработать сгенерированное исключение (по типу).
  4. Если найден соответствующий catch, его код выполняется.
  5. Если подходящий catch не найден на текущем уровне вызовов, исключение "распространяется" вверх по стеку вызовов до тех пор, пока не будет найдена подходящая функция обработки (или программа завершится некорректно).

Пример:

#include <iostream>
#include <stdexcept> // Для стандартных типов исключений

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Division by zero!"); // Генерируем исключение
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0); // Вызываем функцию, которая может бросить исключение
        std::cout << "Result: " << result << std::endl; // Эта строка не выполнится
    } catch (const std::runtime_error& e) { // Ловим исключение типа std::runtime_error
        std::cerr << "Error: " << e.what() << std::endl; // Обрабатываем исключение
    } catch (...) { // Ловим любое другое исключение (многоточие)
        std::cerr << "An unknown error occurred." << std::endl;
    }

    std::cout << "Program continues after error handling." << std::endl;
    return 0;
}

Преимущества:

  • Отделение логики от обработки ошибок.
  • Упрощение кода основного потока выполнения.
  • Возможность обработки ошибок на разных уровнях иерархии вызовов.

Недостатки:

  • Могут влиять на производительность (из-за раскрутки стека).
  • Сложность понимания потока выполнения при наличии множества исключений.
  • Неправильное использование может приводить к утечкам ресурсов (если ресурсы не освобождаются при возникновении исключения до их корректного освобождения).

Для безопасной работы с ресурсами в присутствии исключений часто используются RAII (Resource Acquisition Is Initialization) и умные указатели.