C#异常处理,暂时停止循环

Posted

技术标签:

【中文标题】C#异常处理,暂时停止循环【英文标题】:C# Exception handling, stop the loop temporarily 【发布时间】:2021-03-08 04:43:52 【问题描述】:

我是 C# 新手,我真的需要你的帮助来完成一个项目。

这个想法是向用户询问 1-20 之间的 10 个数字。用户输入的数字存储在一个数组中。在下一阶段,我生成了一个随机数,然后程序将用户之前输入的所有数字与随机数进行比较。如果其中一个数字与程序匹配,则写下“你赢了!”之类的内容。

我当前的解决方案还可以,但我想要一个比当前解决方案更好的异常处理。这是我的问题:

正如您在下面的代码中看到的那样,我依靠循环和 try/catch 来确保用户输入有效数字,但经过多次测试,我发现如果您输入有效输入,假设第一次但不是第二个,无效的输入仍然被发送到 for 循环和下一个索引。 我想确保用户输入一个有效的数字,如果不是,for循环会暂时“暂停”,直到输入下一个有效的数字。

bool start = true; //Create a loop.
            
                while (start == true)
                
                    try
                    
                        for (int x = 0; x < vektor.Length; x++) //To fill my array.
                        
                            Console.WriteLine("Enter a number between 1 and 20:");
                            vektor[x] = int.Parse(Console.ReadLine());
                            start = false;
                        
                        
                    

                    catch
                    
                        Console.WriteLine("Error, you need to enter a number!");
                    
                

                
            

【问题讨论】:

使用int.TryParse(),你不需要异常处理——只要看看TryParse()是返回true还是false并做出相应的响应。 谢谢!我也会看看那个解决方案! 【参考方案1】:

创建一个向用户提出问题并且在其有效之前不给出答案的方法:

public int Ask(string question, int lower, int upper)


    while(true)
    
      Console.WriteLine(question);
      string input = Console.ReadLine();
      bool valid = int.TryParse(input, out int inputInt); //valid is true if it was a number
      
      valid = valid && inputInt >= lower && inputInt <= upper; //but also test was it in range?

      if(valid)
        return inputInt;  //if not valid, repeat the question because the loop is infinite
    


如果用户输入一个数字,valid 将为真,但如果他们输入 40 表示 1 到 20 的范围,那么第二个有效性评估是:

valid = true /*it was a number*/ && true /*40 is >= 1*/ && false /*40 is not <= 20*/

所以有效变成了假。我们只能转义 Ask() 方法,如果valid 为真则返回有效数字,否则循环再次循环

--

现在你可以有一个数字列表,比如你想要 10,我们可以循环并将数字添加到列表中,直到我们得到 10:

List<int> numbers = new List<int>();

while(numbers.Count < 10)

  int validNumber = Ask("Enter a nubmer between 1 and 20: ", 1, 20);
  numbers.Add(validNumber);

如果你愿意,你可以把它作为一个数组来做:

int[] numbers = new int[10];

for(int x = 0; x<numbers.length; x++)

  int validNumber = Ask("Enter a nubmer between 1 and 20: ", 1, 20);
  numbers[x] = validNumber;

因为你知道 Ask 方法永远不会返回,除非输入有效,所以循环“暂停”

【讨论】:

以上是关于C#异常处理,暂时停止循环的主要内容,如果未能解决你的问题,请参考以下文章

java中异常处理

C#自定义异常就这么简单

C# 为啥定时器会自动停止

为啥我的代码停止并且不返回异常?

LibreOffice 停止工作,同时使用 C# 应用程序将 XLS 转换为 XHTML 文件

基础C#异常处理的总结