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
Vous pouvez également capturer des exceptions par référence et non par valeur.
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
Vous devez vous connecter pour publier un commentaire.
Puisque vous ne nous dites pas ce que l'entrée que vous donnez à votre programme, je ne peux que deviner:
Vous tapez quelque chose qui cin ne peut pas analyser la séquence
inputNumerator >> slash >> inputDenominator
, donc, il va dans un échec de l'état ou en mauvais état. L'exception est lancée dans la branche else de votre fonction (vous pouvez le tester en impression le message de l'exception dans votre fonction principale du bloc catch).Votre boucle principale qui se passe, mais
cin
est laissé en mauvais état, de sorte que chaque entrée suivants échoue à nouveau et la même exception est levée, encore et encore. Pour éviter que vous devez supprimer de l'état de cin lors de la gestion d'erreur. En outre, si il ya des mauvais caractères dans le flux d'entrée qui ne peut pas être analysé, ils doivent être jetés, ouignore
d:garbage
comme une entrée ou unesteveaoki
. De toute façon, j'ai essayé et ça ne fonctionne pas. Je pense qu'il pourrait avoir quelque chose à voir avec le fait que j'ai un inputstream dans la fonction.J'ai édité la réponse, j'ai raté le
ignore
de la mauvaise entrée en premier.En fait je viens de trouvé un fil qui a la même réponse, et il a travaillé pour moi, donc oui je peux vous le confirmer. Merci!!!!
Aucune idée de pourquoi ça serait d'échec, si je suis entré juste 0?
il ne pourrait pas lire le slash et le dénominateur vous souhaitez explicitement. De la prise de ceux en option nécessite un peu plus de travail.
OriginalL'auteur Arne Mertz