我在C++的Fraction
類中有一個重載操作符,它被設計爲以整數形式從標準輸入取整輸入,即整數形式,即1/2
或32/4
,並基於這些值初始化Fraction
對象。它的工作原理,但我很難捕捉錯誤。如何拋出std :: invalid_argument錯誤?
// 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;
}
我調用的方法是這樣的:
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;
}
}
但每當發生錯誤時,(我會進入類似garbage
)這將導致循環永遠繼續下去,而不要求輸入。這是什麼原因?
除了對你的代碼有一點意見:如果你寫的輸入'運算符<<,您應該使用傳遞給它的srteam而不是回落到'std :: cin'。然後這可以按預期工作:'ifstream if(somefile.txt);如果>> frac;' –
您也可能想通過引用來捕獲異常,而不是通過值。 – BitTickler