Кратко:

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


Особенности исключений в C++

Типы исключений

  • Стандартные исключения: В C++ предусмотрены стандартные исключения, такие как std::runtime_error, std::logic_error, std::invalid_argument, которые можно использовать для различных типов ошибок.
  • Пользовательские исключения: Программисты могут определять собственные классы исключений для специфических ситуаций в своих программах.

Механизм Выброса и перехвата

см. Обработка ошибок. Механизм исключений. try-throw-catch

Иерархия исключений

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

RAII и исключения

см. Гарантии безопасности исключений. Применение идиомы RAII

Необходимость обработки

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

Пример использования исключений:

#include <iostream>
#include <stdexcept>
 
double divide(int a, int b) {
    if (b == 0) {
        throw std::invalid_argument("Division by zero");
    }
    return static_cast<double>(a) / b;
}
 
int main() {
    try {
        int num1, num2;
        std::cout << "Enter two numbers: ";
        std::cin >> num1 >> num2;
 
        double result = divide(num1, num2);
        std::cout << "Result of division: " << result << std::endl;
    } catch (const std::invalid_argument& e) {
        std::cerr << "Invalid argument: " << e.what() << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "Exception occurred: " << e.what() << std::endl;
    } catch (...) {
        std::cerr << "Unknown exception occurred" << std::endl;
    }
 
    return 0;
}

В этом примере используется функция divide, которая генерирует исключение std::invalid_argument, если второй аргумент равен нулю. Исключение перехватывается в блоке catch, где выводится сообщение об ошибке.