简单的尝试捕获c ++的循环解决方案

时间:2015-02-01 10:56:42

标签: c++ try-catch gnu

我无法理解为什么会失败。为什么在抛出错误后它会永远循环?

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

2 个答案:

答案 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旗帜及其价值。