如何修复bad_typeid异常

时间:2019-06-01 14:29:11

标签: c++ exception recursion try-catch typeid

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

“ 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;
}

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

感谢您的宝贵时间和协助。

1 个答案:

答案 0 :(得分:0)

bad_typeid不能这样工作。将typeid应用于已取消引用的空指针时,将引发该错误。在这种情况下完全不相关。

例如,如果用户输入

5.5

然后std::cin >> input将尝试输入整数(在这种情况下为5)。如果用户输入了类似的字母

foo

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