Comment throw std::invalid_argument erreur?

J'ai une surcharge de l'opérateur dans mon Fraction classe en C++, qui est conçu à partir de l'entrée standard sous la forme d'un entier sur un entier c'est à dire 1/2 ou 32/4 et initialiser un Fraction objet en fonction de ces valeurs. Il fonctionne, mais je vais avoir de la difficulté à reprendre les erreurs.

//gets input from standard input in the form of (hopefully) int/int
std::istream& operator >>(std::istream& inputStream, Fraction& frac)
{
    int inputNumerator, inputDenominator;
    char slash;

    if ((std::cin >> inputNumerator >> slash >> inputDenominator) && slash == '/')
    {
        if (inputDenominator == 0)
        {
            std::cout << "Denominator must not be 0." << std::endl;
            throw std::invalid_argument("Denominator must not be 0.");
        }
        frac.numerator = inputNumerator;
        frac.denominator = inputDenominator;

        frac.reduce();
    }
    else
    {
        throw std::invalid_argument("Invalid syntax.");
    }



    return inputStream;
}

J'invoque la méthode comme ceci:

 Fraction frac(1, 2);


while (true)
{
    try {
        std::cout << "Enter a fraction in the form int/int: ";
        std::cin >> frac;
        std::cout << frac;
    } catch (std::invalid_argument iaex) {
        std::cout << "Caught an error!" << std::endl;
    }
}

Mais à chaque fois qu'une erreur est levée, (je vais entrer quelque chose comme garbage) ce qui provoque la boucle pour aller à l'infini, sans avoir à demander d'entrée. Quelle est la raison?

Un petit commentaire, en plus de votre code: si vous écrivez une entrée operator<<, vous devez utiliser le srteam passé plutôt que de retomber std::cin. Cela peut fonctionner comme prévu: ifstream if(somefile.txt); if >> frac;
Vous pouvez également capturer des exceptions par référence et non par valeur.

OriginalL'auteur michaelsnowden | 2014-02-11