我的用户输入的每一行都有一个try {} catch {}
,这是为了确保它的格式/范围/可接受。然而,它似乎并没有......干得好!这是我的一个例子。
string userAnswer;
bool errorHandling = true;
while (errorHandling){
try{
userAnswer = Console.ReadLine();
if (userAnswer == "1") {
singleGrade.grapher(acount, bcount, ccount, dcount, ecount, fcount);
}else{
if (userAnswer == "2"){
readIn.Classes(SingleGrade[1]);
}else{
if (userAnswer == "3"){
countAll.allGrades(multiGrade);
} else{
errorHandling = false;
}
}
}
}
catch (FormatException a){
Console.WriteLine(a.Message);
//Console.WriteLine("Error - please enter a number between 1 & 6.");
}
} // end of While loop
如果有人可以向我解释为什么在收到无效号码/格式不正确时没有发现错误。
答案 0 :(得分:3)
由于输入了有效的字符串,因此没有抛出FormatException
。例如,如果要将用户输入转换为整数,则会抛出FormatException
。但是因为你把它留作字符串,所以不会抛出任何异常。
但是,由于您实际上只是试图限制用户输入,并且此处没有发生任何真正的例外情况,您应该只通过应用程序逻辑处理它。
你真正想要的是这样的事情:
bool errorHandling = true;
while (errorHandling)
{
string userAnswer = Console.ReadLine();
switch (userAnswer)
{
case "1":
singleGrade.grapher(acount, bcount, ccount, dcount, ecount, fcount);
errorHandling = false;
break;
case "2":
readIn.Classes(SingleGrade[1]);
errorHandling = false;
break;
case "3":
countAll.allGrades(multiGrade);
errorHandling = false;
break;
// cases for 4, 5, and 6...
default:
Console.WriteLine("Error - please enter a number between 1 & 6.");
break;
}
} // end of While loop
答案 1 :(得分:0)
当数字无效时你不会抛出异常,你只是处理一堆if
语句 - 因此,由于没有throw
语句,所以没有任何内容可以命中{{ 1}}声明,而你正在看到我们通俗地称之为“堕落错误” - 逻辑正在超越应有的地方。
如果您在输入无效时需要例外,只需在catch
语句的末尾添加throw new FormatException
,这样您就可以获得“如果我们在这里做出问题”行为。< / p>
答案 2 :(得分:0)
原因是你正在抓取一个字符串,而不是试图将其转换为其他任何字符串,因此没有FormatException
。
我不会使用try / catch
进行输入验证,而是使用TryParse
类型的Int
方法。
我通常做的是编写一个单独的函数来获取用户的验证输入,然后从我的主代码中调用它。在这种情况下,由于您有上限和下限要求,您可以考虑编写如下内容:
public static int GetBoundedIntFromUser(int minVal, int maxVal)
{
if (minVal >= maxVal)
{
throw new ArgumentException("minVal must be less than maxVal.");
}
int input;
while (true)
{
Console.Write("Please enter a number from {0} to {1}: ", minVal, maxVal);
if (int.TryParse(Console.ReadLine(), out input)
&& input >= minVal && input <= maxVal)
{
break;
}
Console.WriteLine("That input is not valid. Please try again.");
}
return input;
}
然后你可以从你的主代码中调用它(没有任何try catch),例如:
switch (GetBoundedIntFromUser(1, 3))
{
case 1:
singleGrade.grapher(acount, bcount, ccount, dcount, ecount, fcount);
break;
case 2:
readIn.Classes(SingleGrade[1]);
break;
case 3:
countAll.allGrades(multiGrade);
break;
default:
break;
}