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

Simple try catch looping solution for c++

本文关键字:循环 解决方案 c++ 简单      更新时间:2023-10-16

我不明白为什么会失败。为什么它在抛出错误后会永远循环?

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

您的问题在错误后正在恢复。

首先,您必须使用 cin.clear() 清除错误标志cin。然后,您必须读取错误的输入,以便下次不会导致错误:

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'行的末尾。

如果o.spr()投掷,您将undone设置为 true .然后检查while()中的条件,它true,所以它会循环,尝试再次调用o.spr(),依此类推......重新考虑您的undone标志及其价值。