【问题标题】:Try/Catch and loop尝试/捕捉和循环
【发布时间】:2017-03-21 08:21:44
【问题描述】:

1) 尝试捕获后,我想再次循环它以提供新数字("Console.ReadLine("Give correct number")),因为用户没有输入可转换为双精度的字符串 2第二个问题是,当用户输入错误号码时,我想再次循环输入新号码。这个版本的程序给小号或大号发消息并退出

修正

double number=10,11;
Console.WriteLine("Give a number");
string w=Console.ReadLine();
try
{
double d = Convert.ToDouble(w);
}
catch(FormatException)
{
Console.WriteLine("it is not a number");        
}
double dd=Convert.ToDouble(w);
if (dd == number)
{
Console.WriteLine("Yes, it is!");
}
else if (number<dd)
{
Console.WriteLine("to big number");
}
else if(number>dd)
{
Console.WriteLine("to small number");
}
Console.ReadLine();

【问题讨论】:

    标签: c#


    【解决方案1】:

    首先,使用do..while(condition) 不断询问,直到用户输入有效号码。其次,使用TryParse 来检查值是否有效。这比异常处理和转换两次要好。不确定您为什么使用doubles,但ints 可能更合适。

    bool valid = false;
    do
    {
        bool newValidState;
        Console.WriteLine("Give a number");
    
        string w = Console.ReadLine();
    
        double d;
        if (!double.TryParse(w, out d))
        {
            Console.WriteLine("it is not a number");
            newValidState = false;
        }
        else if (d == number)
        {
            Console.WriteLine("Yes, it is!");
            newValidState = true;
        }
        else if (wyliczona < wybor) // these conditions seem unrelated to `d`
                                    // are they okay?
        {
            Console.WriteLine("to big number");
            newValidState = false;
        }
        else if(wyliczona > wybor)
        {
            Console.WriteLine("to small number");
            newValidState = false;
        }
        else
        {
            Console.WriteLine("unknown condition. needs work.");
            newValidState = false;
        }
    
        valid = newValidState;
    }
    while (!valid);
    

    注意newValidState 的使用,这将确保您始终为valid 分配一个新值。这有助于防止由于从不设置值而导致的无限循环。除非每个分支都将newValidState 设置为一个值,否则代码不会编译。

    【讨论】:

    • 如果 OP 必须使用 double,指出 == 在某些情况下可能会在没有 epsilon 测试的情况下失败
    • 是的,很容易把事情搞砸@pinkfloydx33。
    【解决方案2】:

    试试这个:

    var number =3;
    do{
        Console.WriteLine("Give a number");
        string w=Console.ReadLine();
        try
        {
            double d = Convert.ToDouble(w);
        }
        catch(FormatException)
        {
            Console.WriteLine("it is not a number");
            continue; // not a number starting new iteration of the loop
        }
        double dd=Convert.ToDouble(w);
        if (dd == number)
        {
            Console.WriteLine("Yes, it is!");
            break; // The number guessed exiting loop
        }
        else if (dd>number)
        {
            Console.WriteLine("to big number");
        }
        else if(dd<number)
        {
            Console.WriteLine("to small number");
        }
    }
    while (true);
    Console.ReadLine();
    

    【讨论】:

    • 永远不要使用while (true) 这是邪恶的!
    • @PatrickHofman 即使在这个例子中?如果它允许您提供更紧凑且不易出错的代码,则可以使用它。
    • 是的。向新开发人员学习这种反模式实在是太糟糕了。
    • @PatrickHofman 很有争议。 KISS 原则说解决方案不要过于复杂。所以看不到你“禁止”使用while(true)的原因
    • 我猜你从来不需要调试一个正在运行的生产服务器,它有 100% 的 CPU 负载,因为一些意外情况让它永远运行......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多