Как исправить исключение bad_typeid - PullRequest
1 голос
/ 01 июня 2019

Меня попросили создать простую программу.См. Ниже:

"1. Напишите простую программу, которая использует рекурсию для вычисления факториала числа - убедитесь, что выдается исключение, если пользователь вводит отрицательное целое число или нецелочисленный тип данных, из которого нужно вычислитьфакториал. "

Я создал программу для вычисления факториала числа в блоке while, позволяя пользователю делать неограниченные попытки.Мой блок try-catch хорошо работает для отрицательного исключения, однако не целочисленное исключение не работает.

int Factorial(int input)
{
    if (input > 1)
        return input * Factorial(input - 1);
    else if (input < 0)
        throw NegativeException(input);
    else
        return 1;
}

int main()
{
    using std::cout;
    using std::cin;
    int input;

    while (1)
    {
        try
        {
            cout << "Please enter an integer to find its factorial: ";
            cin >> input;
            cout << "The factorial of " << input << " is " << Factorial(input) << endl;
        }
        catch (const std::bad_typeid & ex)
        {
            cout << "Exception: " << ex.what();
            cout << "Try another integer\n" << endl;
        }
        catch (NegativeException& ex1)
        {
            cout << ex1.what();
            cout << "Try another integer\n" << endl;
        }
    }

    return 0;
}

Когда я ввожу букву, я ожидаю, что на выходе будет указано "Exception: bad_typeid Попробуйте другоецелое».Однако, когда я ввожу букву вместо int, bad_typeid не перехватывается.Кажется, он возвращает 0 и выдает «Факториал 0 равен 1».Затем запускается блок while (1), который создает бесконечный вывод вышеприведенного сообщения.

Я ценю ваше время и помощь.

1 Ответ

0 голосов
/ 02 июня 2019

bad_typeid не работает так.Он генерируется, когда typeid применяется к нулевому указателю с разыменованным указателем.В этом случае совершенно не имеет значения.

Если, например, пользователь ввел

5.5

, тогда std::cin >> input попытается ввести целое число (в нашем случае - 5).Если пользователь вводит букву, такую ​​как

foo

, тогда std::cin >> input установит failbit и не выдаст исключение.

...