【问题标题】:Where do i put the try-catch in my for-loop?我在哪里将 try-catch 放在我的 for 循环中?
【发布时间】:2018-11-29 22:33:58
【问题描述】:

我现在已经完成了我的代码的基础知识,它可以正常工作。但是现在我想添加一个 try-catch 异常,这样如果用户输入的不是整数,它就会抛出一个异常并说:错误的输入再试一次。这是我需要它的地方:

for (int i = 0; i < nummer.Length; i++)
                {

                    Console.Write("Nummer " + talnr + ": ");
                    talnr++;
                    string str = Console.ReadLine();
                    int element = Convert.ToInt32(str);
                    nummer[i] = element;

                }

循环将循环 10 次并将输入存储在一个数组中。当我尝试时,它要么产生异常但继续循环或中断循环并继续下一个代码块..

【问题讨论】:

  • 这取决于您在catch 之后要继续执行的位置。
  • 编写一个从用户那里获取 one 字符串的方法,直到他们提供一个有效的字符串。一旦你有了这个方法,编写代码来绕过它来完成剩下的工作就会变得容易得多。
  • @SLaks 好吧,用户将被要求输入 10 个数字。如果第一个数字不是整数,我不希望它继续循环,但要求用户再试一次,直到做出正确的输入。如果用户在 5 次循环后输入字母也是如此!
  • 请记住将其中一个回复标记为已接受的答案,以便其他访问该主题的人可以看到哪个答案提供了正确的解决方案。

标签: c# loops for-loop try-catch


【解决方案1】:

我倾向于使用...

bool parsed = Int.TryParse(str, out myInt);
If (parsed)
{
    // do something
}

恕我直言,只有在存在无法“预测”以进行相应处理(例如日志错误等) 然后继续而不会使您的程序崩溃。

始终尝试使用框架中可用的方法和函数来处理“已知”。

【讨论】:

    【解决方案2】:

    您尝试执行的操作不需要try-catch。您可以使用TryParse 方法检查所需输入是否为格式正确的整数,并提示用户输入不同的输入。

    for (int i = 0; i < nummer.Length; i++)
    {
        bool isAnInteger = false;
        int element = 0;
    
        Console.Write("Nummer " + talnr + ": ");
        talnr++;
        string str = Console.ReadLine();
    
        // evaluates to true if str can be parsed as an int, false otherwise
        // and outputs the parsed int to element
        isAnInteger = int.TryParse(str, out element); 
    
        while (!isAnInteger)
        {
            Console.Write("Wrong input, try again. ");
            str = Console.ReadLine();
            isAnInteger = int.TryParse(str, out element);
        }
    
    
        nummer[i] = element;
    
    }
    

    【讨论】:

    • 谢谢!我不确定'try-catch'是要走的路。我很新,还在学习!令人惊讶的是,您在此网站上获得回复的速度如此之快!
    • @Simon:我假设每个人都被教导使用Convert.ToInt32(或int.Parse)。似乎每个初学者都使用它来解析输入。您应该很快了解到使用 SomeTypeGoesHere.TryParse 总是更好(如果可用)。 exceptional 情况应该例外;糟糕的用户输入绝不是例外。
    【解决方案3】:

    使用 int.TryParse 方法。

    此代码从用户读取修剪后的输入字符串并尝试将其转换为整数。如果转换成功,它会创建一个名为“result”的整数变量,然后您可以在 IF 块中使用它。如果转换失败,您可以在 ELSE 块中为您想要发生的事情编写代码。如果列表中总共需要 10 个整数,我会放弃 FOR 循环,转而使用 DO WHILE 循环来检查有多少整数被成功转换并添加到列表中。它将一直请求输入,直到列表被 10 个整数填充。

    List<int> elements = new List<int>();
    
    do
    {
        Console.WriteLine("Please enter an integer.");
    
        if (int.TryParse(Console.ReadLine().Trim(), out int result))
        {
            Console.WriteLine($"You entered the integer {result}");
            elements.Add(result);
        }
        else
        {
            Console.WriteLine("You must enter an integer. Please try again.");
        }
    
    } while (elements.Count < 10);
    

    【讨论】:

      【解决方案4】:

      如果你想用 try catch 循环来保存你的代码,那就是:

      for (int i = 0; i < nummer.Length; i++)
              {
                  try { 
      
                  Console.Write("Nummer " + talnr + ": ");
                  talnr++;
                  string str = Console.ReadLine();
                  int element = Convert.ToInt32(str);
                  nummer[i] = element;
      
                  }
                  catch
                  {
                      MessageBox.Show("Error, numbers only");
                      goto breakloop;
                  }
      
              }
              breakloop:;
      

      如果发生错误,goto 语句结束循环

      【讨论】:

      • 我强烈建议不要使用 goto 语句。在上面的例子中,这没有任何作用,因为 try catch 之外的自然逻辑流会得出相同的结论。 Goto 语句是一个时代的遗留物,出于兼容性/遗留目的可能已包含在 .NET 框架中,我始终主张使用适当的逻辑流语句而不是 goto 语句。当你有时间时,谷歌“为什么 goto 语句不好”看看为什么!
      【解决方案5】:

      如果可以提供帮助,最好不要抛出异常。在这种情况下,您可以改用int.TryParse()。这段代码可以替换你的int element... 行:

      int element;
      if (!int.TryParse(str, out element)) {
          Console.WriteLine("Bad!!");
          i--;
          continue;
      }
      

      i-- 是为了确保i 在循环的下一次交互中具有相同的值。这样做将确保您在完成循环之前仍然获得 10 个有效输入。 (许多人会说这是一件非常糟糕的事情,但这样做的原因是可读性 - 如果您有一个大的 for 循环并在中间某处减小值,那么下一个查看您的人就很难代码来准确理解发生了什么。但这是一个短循环,所以很明显。请注意这一点。)

      continue 关键字跳过循环的其余部分并继续进行下一个迭代(因此您不会将错误值添加到数组中)。

      【讨论】:

      • i--for(int i = ...) 循环中通常是一个非常糟糕的主意。
      • 见仁见智。 :) 对于这样的短循环,它不会损害可读性。
      • 代码质量不仅仅是意见或品味。
      • 虽然我不同意 Henk 的观点,即一般来说使用减量运算符是一个坏主意,而且这可能会受到意见的影响,但我一直是一名专业开发人员,从事过很多多年来,从未发现对其使用的合法要求。仅仅因为你可以,并不意味着你应该!
      • 我同意我自己可能会以不同的方式写这个。但它足够短,无论哪种方式都没有区别。这不是一个 200 行的 for 循环,中间隐藏了一个 i--。很明显发生了什么。
      猜你喜欢
      • 2015-02-08
      • 2010-10-06
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 2021-01-27
      • 2016-07-02
      相关资源
      最近更新 更多