блок catch() не работает c++
Здраствуйте!!! Использую в своей программе конструкцию try{}catch(){} и по какой-то причине при возникновении ошибке блок catch просто пропускается. Пишу на с++. Что мне делать? Код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <exception>
#include <thread>
#include <Windows.h>
#include <exception>
using namespace std;
short* number;
int main() {
setlocale(LOCALE_ALL, "ru");
try {
printf("...");
scanf("%i", &number);
}
catch (exception ex) {
printf("error:%s", ex.what());
}
return 0;
}
Ответы (1 шт):
Начнем с того что находится внутри try? printf и scanf, это си функции. В си не было исключений, так что логично, что эти функции не вызывают исключений. Проверять правильность ввода в scanf() c использованием исключением можно так:
if (scanf("%hi", number) != 1) {
throw std::runtime_error("Ошибка ввода числа");
}
Также я заметил неправильное использование типа исключения. Вы должны использовать ссылку на исключение (exception&), а не копию (exception), чтобы передать исключение в блок catch:
catch (exception& ex) {}
В итоге общая реализация будет выглядеть так:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <clocale>
#include <exception>
#include <stdexcept>
int main() {
setlocale(LC_ALL, "ru");
short* number = new short;
try {
printf("Введите число: ");
if (scanf("%hi", number) != 1) {
throw std::runtime_error("Ошибка ввода числа");
}
} catch (std::exception& ex) {
printf("Ошибка: %s\n", ex.what());
}
delete number;
return 0;
}
В комментариях пользователь AR Hovsepyan посоветовал не использовать в вашем случаи обработчик исключений из-за отсутствия нужды в нем.
int main() {
setlocale(LC_ALL, "ru");
short* number = new short;
printf("Введите число: ");
if (scanf("%hi", number) != 1) {
printf("Ошибка ввода числа");
delete number;
return -1;
}
delete number;
return 0;
}