尝试{} Catch {}在C#中不能正常工作

时间:2015-01-06 16:56:14

标签: c# try-catch

我的用户输入的每一行都有一个try {} catch {},这是为了确保它的格式/范围/可接受。然而,它似乎并没有......干得好!这是我的一个例子。

string userAnswer;
        bool errorHandling = true;
        while (errorHandling){

            try{
                userAnswer = Console.ReadLine();

                if (userAnswer == "1") {
                  singleGrade.grapher(acount, bcount, ccount, dcount, ecount, fcount);
                }else{
                    if (userAnswer == "2"){
                      readIn.Classes(SingleGrade[1]);

                    }else{
                        if (userAnswer == "3"){
                           countAll.allGrades(multiGrade);
                        } else{
                           errorHandling = false;
                        }
                     }
                  }
              }
        catch (FormatException a){
                Console.WriteLine(a.Message);
                //Console.WriteLine("Error - please enter a number between 1 & 6.");
            }
    } // end of While loop 

如果有人可以向我解释为什么在收到无效号码/格式不正确时没有发现错误。

3 个答案:

答案 0 :(得分:3)

由于输入了有效的字符串,因此没有抛出FormatException。例如,如果要将用户输入转换为整数,则会抛出FormatException。但是因为你把它留作字符串,所以不会抛出任何异常。

但是,由于您实际上只是试图限制用户输入,并且此处没有发生任何真正的例外情况,您应该只通过应用程序逻辑处理它。

你真正想要的是这样的事情:

bool errorHandling = true;
while (errorHandling)
{
        string userAnswer = Console.ReadLine();   
        switch (userAnswer)
        {
            case "1":
              singleGrade.grapher(acount, bcount, ccount, dcount, ecount, fcount);
              errorHandling = false;
              break;

            case "2":  
              readIn.Classes(SingleGrade[1]);
              errorHandling = false;
              break;

            case "3":
              countAll.allGrades(multiGrade);
              errorHandling = false;
              break;

            // cases for 4, 5, and 6...

            default:
              Console.WriteLine("Error - please enter a number between 1 & 6.");
              break;
        }        
} // end of While loop 

答案 1 :(得分:0)

当数字无效时你不会抛出异常,你只是处理一堆if语句 - 因此,由于没有throw语句,所以没有任何内容可以命中{{ 1}}声明,而你正在看到我们通俗地称之为“堕落错误” - 逻辑正在超越应有的地方。

如果您在输入无效时需要例外,只需在catch语句的末尾添加throw new FormatException,这样您就可以获得“如果我们在这里做出问题”行为。< / p>

答案 2 :(得分:0)

原因是你正在抓取一个字符串,而不是试图将其转换为其他任何字符串,因此没有FormatException

我不会使用try / catch进行输入验证,而是使用TryParse类型的Int方法。

我通常做的是编写一个单独的函数来获取用户的验证输入,然后从我的主代码中调用它。在这种情况下,由于您有上限和下限要求,您可以考虑编写如下内容:

public static int GetBoundedIntFromUser(int minVal, int maxVal)
{
    if (minVal >= maxVal)
    {
        throw new ArgumentException("minVal must be less than maxVal.");
    }

    int input;

    while (true)
    {
        Console.Write("Please enter a number from {0} to {1}: ", minVal, maxVal);

        if (int.TryParse(Console.ReadLine(), out input)
            && input >= minVal && input <= maxVal)
        {
            break;
        }

        Console.WriteLine("That input is not valid. Please try again.");
    }

    return input;
}

然后你可以从你的主代码中调用它(没有任何try catch),例如:

switch (GetBoundedIntFromUser(1, 3))
{
    case 1:
        singleGrade.grapher(acount, bcount, ccount, dcount, ecount, fcount);
        break;

    case 2:
        readIn.Classes(SingleGrade[1]);
        break;

    case 3:
        countAll.allGrades(multiGrade);
        break;

    default:
        break;
}