此代码需要用户输入。
我希望用户在发送错误输入后再次尝试并触发以下任何例外情况。
在异常后触发getInputNumber()并且用户输入正确的输入作为数字后,将触发返回,返回正确的数字。
在返回之后,它返回到FormatException,从而删除正确的数字值并仅返回0.
我如何修复它以获得正确的值,但如果他错过了正确的输入,还允许用户再次尝试?
private static int getInputNumber()
{
int number = 0;
try
{
number = Convert.ToInt32(Console.ReadLine());
}
catch (Exception ex)
{
if (ex is FormatException)
{
Console.Clear();
Console.WriteLine("Wrong format! \nTry numbers instead.");
getInputNumber();
}
else if (ex is OverflowException)
{
Console.Clear();
Console.WriteLine("The number you entered is too large.\nTry a number between 1 and 2,147,483,647");
getInputNumber();
}
}
return number;
}
答案 0 :(得分:1)
首先,我建议使用Int32.Parse
代替。在这种特殊情况下,它不会有太大的不同,但它被认为是最佳实践。要使代码正常工作,您需要为return
的每次递归调用添加getInputNumber
语句:
private static int getInputNumber()
{
int number = 0;
try
{
number = int.Parse(Console.ReadLine());
}
catch (Exception ex)
{
if (ex is FormatException)
{
Console.Clear();
Console.WriteLine("Wrong format! \nTry numbers instead.");
return getInputNumber();
}
else if (ex is OverflowException)
{
Console.Clear();
Console.WriteLine("The number you entered is too large.\nTry a number between 1 and 2,147,483,647");
return getInputNumber();
}
}
return number;
}
然而,让getInputNumber
像这样递归是一个坏主意。相反,你应该使用无限循环。最终结果将如下所示:
private static int getInputNumber()
{
int number = 0;
while (true)
{
try
{
number = int.Parse(Console.ReadLine());
break;
}
catch (Exception ex)
{
if (ex is FormatException)
{
Console.Clear();
Console.WriteLine("Wrong format! \nTry numbers instead.");
}
else if (ex is OverflowException)
{
Console.Clear();
Console.WriteLine("The number you entered is too large.\nTry a number between 1 and 2,147,483,647");
}
else
{
Console.Clear();
Console.WriteLine("Unexpected error!");
}
}
}
return number;
}
答案 1 :(得分:1)
在你的catch块试试这个:
...
if (ex is FormatException)
{
Console.Clear();
Console.WriteLine("Wrong format! \nTry numbers instead.");
return getInputNumber();
}
....
而不只是调用它。这是因为当你在第一次捕获之后调用getInputNumber()方法并且它传递成功时,它会返回到catch块(此时,由于发生异常,数字仍为0)
正如stybl所说,最好使用布尔检查和while循环来继续询问有效的输入用户。