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