#новичкам
Вы делаете какие-то вычисления и среди них есть целочисленное деление:
void fun(int a, int b) {
// some calculations
auto res = a / b;
// some calculations
}
Вы уже наслышаны о том, что в С++ есть механизм обработки исключений и просто оборачиваете вашу функцию в try-catch и думаете, что С++ позаботится о том, что вы будете информированы о всех проблемах, которые могут произойти в коде:
try {
fun(1, 2);
} catch(std::exception& ex) {
std::cout << "Calculation error: " << ex.what() << std::endl;
}Однако помните, что вы пишите на С++. Здесь уровень заботы примерно, как у бати, который вывозит неумеющего плавать сына на середину реки и бросает его в воду с криками "Плыви, сынок!".
Если вдруг вы передадите в fun вторым параметром ноль:
try {
fun(1, 0);
} catch(std::exception& ex) {
std::cout << "Calculation error: " << ex.what() << std::endl;
}то С++ не пошлет исключение об этой ситуации.
Стандарт явно говорит: целочисленное деление на ноль приводит к неопределенному поведению. У меня например программа просто падает с надписью:
Floating point exception. Очень иронично со стороны компилятора обрабатывать эту ситуацию, выводя в консоль текст о появлении исключения, хотя его тут нет и его никак не отловить.Поэтому нужно проверять входные данные и самим явно кидать исключения или использовать другой способ обработки ошибки:
void fun(int a, int b) {
if (!b) {
throw std::runtime_error("Devision by zero!");
}
// some calculations
auto res = a / b;
// some calculations
}
try {
fun(1, 0);
} catch(std::exception& ex) {
std::cout << "Calculation error: " << ex.what() << std::endl;
}Тогда на консоль явно выведется ожидаемое
Calculation error: Devision by zero!.Так что будьте осторожны и проверяйте входные данные.
Stay alert. Stay cool.
#cppcore