限制用户输入为指定的一组值
限制用户输入为指定的一组值
我在我的第一个类中有一个do while循环,目标是循环,直到用户输入英尺、米或码为止:\n
string convert = ""; do { Console.Clear(); Console.WriteLine("What conversion: Feet, Meters, Yards"); try { convert = Convert.ToString(Console.ReadLine()); } catch (Exception) { Console.Clear(); Console.WriteLine("Incorrect conversion"); Console.ReadKey(); } convert = Values.Input(convert); Console.WriteLine(convert); Console.ReadKey(); } while (_____); // 尝试在我的其他类中抛出参数时循环 Console.WriteLine("Continue on"); Console.ReadLine();
\n我的单独的values类Input方法:\n
public static string Input(string input) { string convert = input; if (convert == "Meters") { input = "Meters"; } else if (convert == "Feet") { input = "Feet"; } else if (convert == "Yards") { input = "Yards"; } else { throw new System.ArgumentException("Incorrect conversion"); //如果在这里抛出ArgumentException,我尝试循环我的主程序 } return input; }
\n我的尝试:\n
} while (convert != "Meters" || convert != "Feet" || convert != "Yards"); Console.WriteLine("Continue on"); Console.ReadLine();
\n我尝试告诉它在convert不是Meters、Feet或Yards时继续循环,但在抛出参数后,我无法继续执行程序。\n我能在抛出这个System.ArgumentException之后继续我的应用吗?如果可以,我应该输入什么来允许这个while循环?
【问题】:如何将用户输入限制为指定值集合中的一个值?
【原因】:旧的Input()函数没有对用户输入进行任何处理,需要将其替换为能够限制输入值的新函数。
【解决方法】:将Input()函数替换为以下代码块:
public enum Unit { Meters, Feet, Yards }
public static Unit Input(string input)
{
switch (input.ToLowerInvariant())
case "meters": return Unit.Meters;
case "feet": return Unit.Feet;
case "yards": return Unit.Yards;
default: throw new System.ArgumentException("Incorrect conversion");
}
}
接下来,修复代码如下:
Unit unit;
while (true)
{
Console.WriteLine("What conversion: Feet, Meters, Yards");
try
{
var input = Console.ReadLine();
unit = Values.Input(convert);
break; // 如果没有抛出异常,可以退出循环
}
catch
{
Console.WriteLine("Incorrect conversion");
}
}
Console.WriteLine("Continue on");
Console.ReadLine();
对于(input.ToLowerInvariant())这一行,它的作用是将输入转换为小写。但是,应该始终考虑输入的字符集。以下是一个能够解释的好问题:stackoverflow.com/questions/6225808/…
问题的原因是在调用Values.Input()
的位置在try/catch语句之外,当出现异常时,它不会在定义的catch中处理。因此,它会被调用堆栈捕获。尝试将Values.Input(..)
放在try/catch语句内部。
解决方法是将Values.Input(..)
放在try/catch语句内部,代码如下:
string convert = ""; do { Console.Clear(); Console.WriteLine("What conversion: Feet, Meters, Yards"); try { convert = Convert.ToString(Console.ReadLine()); // ------- PASTE convert = Values.Input(convert); Console.WriteLine(convert); // ----- } catch (Exception) { Console.Clear(); Console.WriteLine("Incorrect conversion"); } // XXXXXXXXX CUT // XXXXXXXXX Console.ReadKey(); } while (_____); //Trying to loop while argument is thrown from my other class Console.WriteLine("Continue on"); Console.ReadLine();