Выбрасывание исключения в C++
Сбой можно вызвать самим, а не ждать его
от библиотеки. Оператор throw создает
исключение и сразу прерывает текущий участок.
Дальше выполнение ищет подходящий
catch. Если его нет, программа
завершается с сообщением об ошибке:
int main() {
throw std::runtime_error("message");
return 0;
}
В учебных задачах удобно выбрасывать готовые
типы из stdexcept. Исключение
std::invalid_argument подходит, когда
параметр нарушает правило:
void requireEven(int n) {
if (n % 2 != 0) {
throw std::invalid_argument("even only");
}
std::cout << n << "\n";
}
int main() {
try {
requireEven(3);
} catch (const std::invalid_argument& e) {
std::cout << "rejected\n";
}
return 0;
}
Исключение std::runtime_error удобно,
если деление на ноль проверяют вручную
до операции /:
int safeDiv(int a, int b) {
if (b == 0) {
throw std::runtime_error("zero divisor");
}
return a / b;
}
int main() {
try {
std::cout << safeDiv(8, 0) << "\n";
} catch (const std::runtime_error& e) {
std::cout << "cannot divide\n";
}
return 0;
}
Текст в конструкторе исключения доступен
через e.what() в блоке catch.
Сообщения в коде пишите на английском, как
и имена переменных.
Создайте функцию printIfPositive с
параметром n. Для n <= 0
выбросьте std::invalid_argument
с сообщением "not positive".
Иначе выведите n.
В main вызовите printIfPositive(-2)
внутри try. В catch для
std::invalid_argument выведите
e.what().