我无法理解为什么会失败。为什么在抛出错误后它会永远循环?
bool undone;
do
{
undone = false;
try
{
o.spr(); // function throwing error E object
}
catch(E &r)
{
undone = true;
cout << r.reason << endl;
}
}
while(undone);
这是功能:
void spr()
{
E r;
int n;
cout << " put n : "<<endl;
cin >> n;
if (cin.fail())
{
r.reason="fail !!";
throw r;
}
cout << " your n is : "<< n;
}
答案 0 :(得分:1)
错误后你的问题正在恢复。
首先,您必须使用cin
清除cin.clear()
的错误标记。然后你必须读取错误的输入,这样下次不会导致错误:
void spr()
{
E r;
int n;
cout << " put n : "<<endl;
cin >> n;
if (cin.fail())
{
cin.clear(); // clear the error flag
std::string bad_input;
cin >> bad_input; // skip over bad input
// now it is safe to re-use cin
r.reason="fail !!";
throw r;
}
cout << " your n is : "<< n;
}
可能是跳过错误输入的更好方法:
void spr()
{
E r;
int n;
cout << " put n : "<<endl;
cin >> n;
if (cin.fail())
{
cin.clear(); // clear the error flag
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip over bad input
r.reason="fail !!";
throw r;
}
cout << " your n is : "<< n;
}
cin.ignore()
函数会跳过最大可能数量的输入字符,直到它到达行'\n'
字符的末尾。
答案 1 :(得分:-1)
如果o.spr()
抛出,则将undone
设置为true
。然后检查while()
中的条件,它是true
,因此它会循环,再次尝试拨打o.spr()
,依此类推......重新考虑您的undone
旗帜及其价值。