如何修复bad_typeid异常

How to fix bad_typeid exception

本文关键字:typeid 异常 bad 何修复      更新时间:2023-10-16

我被要求创建一个简单的程序。见下文:

"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 integern" << endl;
        }
        catch (NegativeException& ex1)
        {
            cout << ex1.what();
            cout << "Try another integern" << endl;
        }
    }
    return 0;
}

当我输入一个字母时,我希望输出显示"异常:bad_typeid尝试另一个整数"。但是,当我输入字母而不是整数时,bad_typeid不会被捕获。它似乎返回 0 并输出"0 的阶乘为 1"。while(1( 块随后被触发, 并创建上述消息的永无止境的输出。

感谢您的时间和帮助。

bad_typeid不是

这样工作的。当typeid应用于取消引用的空指针时,将引发它。在这种情况下完全无关紧要。

例如,如果用户输入

5.5

然后std::cin >> input会尝试输入一个整数(在本例中为 5(。如果用户输入的字母类似

foo

然后std::cin >> input将设置failbit并且不会引发异常。