Кратко:
Исключения в 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, где выводится сообщение об ошибке.