Типы исключений в C++
У каждого исключения есть тип. В catch
указывают именно тип, чтобы реагировать на
конкретную проблему. В учебных задачах часто
встречаются std::invalid_argument
и std::runtime_error из заголовка
stdexcept.
Исключение std::invalid_argument сигнализирует,
что аргумент функции не подходит по смыслу.
Его выбрасывает, например, std::stoi,
если строку нельзя преобразовать в число:
int main() {
std::string raw = "12x";
try {
std::cout << std::stoi(raw) << "\n";
} catch (const std::invalid_argument& e) {
std::cout << "invalid number\n";
}
return 0;
}
Исключение std::runtime_error описывает
ошибку, которую нельзя проверить заранее
или которую удобно сообщить явно через
throw. Типичный учебный случай -
запрет деления на ноль в своей функции:
int main() {
int x = 10;
int y = 0;
try {
if (y == 0) {
throw std::runtime_error("zero divisor");
}
std::cout << x / y << "\n";
} catch (const std::runtime_error& e) {
std::cout << "bad division\n";
}
return 0;
}
Оба типа наследуют std::exception, поэтому
их можно перехватить и через базовый
catch (const std::exception& e) с выводом
e.what(). В одном catch указывают
один тип. Если нужны разные реакции, добавляют
несколько блоков catch подряд.
Дана строка input. В try получите
из нее целое через std::stoi.
В catch для std::invalid_argument
выведите "format".
Даны numerator и denominator.
При нулевом делителе выбросьте
std::runtime_error в try.
В catch для std::runtime_error
выведите "math".