试试,Catch无法返回正确的值

时间:2017-09-22 22:11:37

标签: c# try-catch

此代码需要用户输入。

我希望用户在发送错误输入后再次尝试并触发以下任何例外情况。

在异常后触发getInputNumber()并且用户输入正确的输入作为数字后,将触发返回,返回正确的数字。

在返回之后,它返回到FormatException,从而删除正确的数字值并仅返回0.

我如何修复它以获得正确的值,但如果他错过了正确的输入,还允许用户再次尝试?

private static int getInputNumber()
        {
        int number = 0;

        try
        {
            number = Convert.ToInt32(Console.ReadLine());

        }
        catch (Exception ex)
        {
            if (ex is FormatException)
            {
                Console.Clear();
                Console.WriteLine("Wrong format! \nTry numbers instead.");

                getInputNumber();

            }
            else if (ex is OverflowException)
            {
                Console.Clear();
                Console.WriteLine("The number you entered is too large.\nTry a number between 1 and 2,147,483,647");
                getInputNumber();

            }
        }


        return number;
    }

2 个答案:

答案 0 :(得分:1)

首先,我建议使用Int32.Parse代替。在这种特殊情况下,它不会有太大的不同,但它被认为是最佳实践。要使代码正常工作,您需要为return的每次递归调用添加getInputNumber语句:

private static int getInputNumber()
{
    int number = 0;

    try
    {
        number = int.Parse(Console.ReadLine());
    }
    catch (Exception ex)
    {
        if (ex is FormatException)
        {
            Console.Clear();
            Console.WriteLine("Wrong format! \nTry numbers instead.");
            return getInputNumber();

        }
        else if (ex is OverflowException)
        {
            Console.Clear();
            Console.WriteLine("The number you entered is too large.\nTry a number between 1 and 2,147,483,647");
            return getInputNumber();

        }
    }

    return number;
}

然而,让getInputNumber像这样递归是一个坏主意。相反,你应该使用无限循环。最终结果将如下所示:

private static int getInputNumber()
{
    int number = 0;
    while (true)
    {
        try
        {
            number = int.Parse(Console.ReadLine());
            break;
        }
        catch (Exception ex)
        {
            if (ex is FormatException)
            {
                Console.Clear();
                Console.WriteLine("Wrong format! \nTry numbers instead.");

            }
            else if (ex is OverflowException)
            {
                Console.Clear();
                Console.WriteLine("The number you entered is too large.\nTry a number between 1 and 2,147,483,647");
            }
            else
            {
                Console.Clear();
                Console.WriteLine("Unexpected error!");
            }
        }
    }

    return number;
}

答案 1 :(得分:1)

在你的catch块试试这个:

...
if (ex is FormatException)
{
    Console.Clear();
    Console.WriteLine("Wrong format! \nTry numbers instead.");

   return getInputNumber();

}
....

而不只是调用它。这是因为当你在第一次捕获之后调用getInputNumber()方法并且它传递成功时,它会返回到catch块(此时,由于发生异常,数字仍为0)

正如stybl所说,最好使用布尔检查和while循环来继续询问有效的输入用户。