我在哪里将try-catch放入for循环中?

时间:2018-11-29 22:33:58

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

我现在已经完成了代码的基础知识,它的工作原理与它应该的一样。但是现在我想添加一个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次,并将输入存储在数组中。当我尝试时,它要么成为一个异常,要么继续循环或中断循环,然后继续执行下一个代码块。

5 个答案:

答案 0 :(得分:4)

我赞成使用...

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

恕我直言,try / catch块仅应在无法处理的未处理异常(例如,诸如文件系统交互之类的易失性事件)存在可能性时才真正使用,以进行相应处理(例如,日志错误等)。 ),然后继续进行而不会导致程序崩溃。

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

答案 1 :(得分:0)

您要执行的操作不需要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;

}

答案 2 :(得分:0)

使用int.TryParse方法。

此代码从用户读取修剪后的输入字符串,并尝试将其转换为整数。如果转换成功,它将创建一个称为“结果”的整数变量,然后可以在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);

答案 3 :(得分:-1)

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

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

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

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

答案 4 :(得分:-1)

如果要将代码保留在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语句在发生错误时结束循环