блок catch() не работает c++

Рейтинг: 1Ответов: 1Опубликовано: 15.02.2023

Здраствуйте!!! Использую в своей программе конструкцию 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;
    }

Ответы

▲ 0Принят

Начнем с того что находится внутри 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;
}