【问题标题】:Loop in try catch block在 try catch 块中循环
【发布时间】:2013-06-24 18:22:07
【问题描述】:

我需要一种方法来确保我输入了正确类型的值,并且这将使我达到我应该再次输入它们的地步。我不需要递归来到达方法的开头,我需要一些东西来到达我输入值的地方。我知道我应该使用循环,但我不知道该怎么做。这是方法的一部分:

console.writeline("Enter your value");
double kv = 0;
try
{
    kv = Convert.ToDouble(Console.ReadLine());
}
catch (FormatException)
{
    Console.WriteLine("Enter a number");
}

【问题讨论】:

  • 不要将 Try..Catch 用于预期行为(例如输入不可转换为双精度的字符串)。使用Double.TryParse

标签: c# loops try-catch


【解决方案1】:

您可以遵循以下特定模式:

var data = GetValueFromUser();
while(!IsValid(data))
{
    InformUserTheirDataIsBad();
    data = GetValueFromUser();
}
//data is now valid

【讨论】:

    【解决方案2】:

    使用 Double.TryParse 代替 try/catch:

    Console.Writeline("Enter your value");
    double kv;
    while (!Double.TryParse(Console.ReadLine(), out kv))
        Console.WriteLine("Enter a number");
    

    【讨论】:

    • @Servy 我不确定你的意思;你的答案看起来是一样的,只是你把它全部包装在函数中。
    • @Servy 是的,抱歉,我在 10 秒内编辑了 3 次,因为我意识到自己犯了错误。 :)
    【解决方案3】:

    使用 TryParse

            double kv = 0;
            Console.WriteLine("Enter your value");
            while (double.TryParse(Console.ReadLine(), out kv) == false)
            {
                Console.WriteLine("Enter your value");
            }
    

    【讨论】:

    • 你为什么使用== false 而不是仅仅在前面加上!(逻辑上不是)?
    • @JeppeStigNielsen 因为!condition 看起来更像condition 而不是condition == false
    【解决方案4】:

    您也可以设置do while 循环:

    double kv = 0;
    bool invalid = false;
    do
    {
       console.writeline("Enter your value");       
       try
       {
          kv = Convert.ToDouble(Console.ReadLine());
          invalid = false;
       }
       catch (FormatException)
       { invalid = true;}
    } while (invalid);
    

    【讨论】:

    • 您不应该对控制流使用异常。此外,这会进入无限循环;你从来没有将 invalid 设置为 false。
    • 我同意你的观点,我只是在展示另一种方式。我认为 OP 只是想学习一些循环。
    • 虽然我认为您不应该为此使用 try-catch,但这里有一个带有 try-catch 的循环,看起来更简单:double kv; while (true) { Console.WriteLine("Enter your value"); try { kv = Convert.ToDouble(Console.ReadLine()); break; } catch (FormatException) { } }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2017-08-31
    相关资源
    最近更新 更多