我被要求创建一个简单的程序。见下文:
“ 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)块,并创建上述消息的永无止境的输出。
感谢您的宝贵时间和协助。
答案 0 :(得分:0)
bad_typeid
不能这样工作。将typeid
应用于已取消引用的空指针时,将引发该错误。在这种情况下完全不相关。
例如,如果用户输入
5.5
然后std::cin >> input
将尝试输入整数(在这种情况下为5)。如果用户输入了类似的字母
foo
然后std::cin >> input
会设置failbit
并且不会引发异常。