【发布时间】:2014-03-08 21:21:16
【问题描述】:
我在 C++ 中的 Fraction 类中有一个重载运算符,该运算符旨在以整数形式从标准输入获取输入,即 1/2 或 32/4 并初始化基于 Fraction 对象脱离这些价值观。它可以工作,但我无法捕捉错误。
// 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 的内容)这会导致循环永远持续下去而无需输入。这是什么原因?
【问题讨论】:
-
对你的代码做一点评论:如果你写一个输入
operator<<,你应该使用传递给它的srteam而不是回退到std::cin。然后这可以按预期工作:ifstream if(somefile.txt); if >> frac; -
您可能还想通过引用而不是值来捕获异常。
-
补充@BitTickler 所说的,经验法则是:“按值 抛出,按参考 捕获”跨度>
标签: c++ error-handling try-catch inputstream user-input