Ограничение ввода пользователя одним из указанного набора значений - PullRequest
1 голос
/ 01 апреля 2020

(Я попытался найти подобную проблему без удачи, поэтому я надеюсь, что, может быть, кто-то может предложить решение)

У меня есть время l oop в моем первом классе с целью зацикливания пока пользователь не введет значения футов, метров или ярдов следующим образом:

string convert = "";
                        do
                        {
                            Console.Clear();
                            Console.WriteLine("What conversion: Feet, Meters, Yards");

                            try
                            {
                                convert = Convert.ToString(Console.ReadLine());
                            }
                            catch (Exception)
                            {
                                Console.Clear();
                                Console.WriteLine("Incorrect conversion");
                                Console.ReadKey();
                            }

                            convert = Values.Input(convert);
                            Console.WriteLine(convert);
                            Console.ReadKey();
                        } while (_____); //Trying to loop while arguement is thrown from my other class
                        Console.WriteLine("Continue on");
                        Console.ReadLine();

Мои отдельные классы значений Метод ввода:

public static string Input(string input)
        {
            string convert = input;
            if (convert == "Meters")
            {
                input = "Meters";
            }
            else if (convert == "Feet")
            {
                input = "Feet";
            }
            else if (convert == "Yards")
            {
                input = "Yards";
            }
            else 
            {
                throw new System.ArgumentException("Incorrect conversion");
                //Trying to loop my main program if an ArguementException is thrown here
            }
            return input;
        }

Что я пытался:

                        } while (convert != "Meters" || convert != "Feet" || convert != "Yards"); 
                        Console.WriteLine("Continue on");
                        Console.ReadLine();

Я пытался заставить его продолжать цикл, пока конвертирование не является Метрами, Футами или Ярдами, но после получения аргумента я не могу продолжить программу.

Смогу ли я продолжить свое приложение после бросая это System.ArguementException и, если да, что бы я ввел в свой while l oop, чтобы разрешить это?

Ответы [ 2 ]

3 голосов
/ 01 апреля 2020

Проблема в том, что позиция, в которой вы вызываете Values.Input(), находится за пределами оператора try / catch, и когда это вызывает исключение, оно не обрабатывается в заданном вами улове. Так что это будет догонять стека вызовов. Попробуйте поместить Values.Input(..) внутри оператора try / catch.

string convert = "";
do
{
    Console.Clear();
    Console.WriteLine("What conversion: Feet, Meters, Yards");

    try
    {
        convert = Convert.ToString(Console.ReadLine());
        // -------  PASTE
        convert = Values.Input(convert);
        Console.WriteLine(convert);
        // -----
    }
    catch (Exception)
    {
        Console.Clear();
        Console.WriteLine("Incorrect conversion");
    }

    // XXXXXXXXX CUT
    // XXXXXXXXX
    Console.ReadKey();

} while (_____); //Trying to loop while arguement is thrown from my other class
Console.WriteLine("Continue on");
Console.ReadLine();
1 голос
/ 01 апреля 2020

Эта Input() функция довольно дикая. Что именно он делает? В основном ничего. Вы хотите вернуть какое-то определенное значение, которое указывает, что это за единица измерения, верно?

Давайте заменим это на это:

public enum Unit { Meters, Feet, Yards }

public static Unit Input(string input)
{
    switch (input.ToLowerInvariant())
        case "meters": return Unit.Meters;
        case "feet": return Unit.Feet;
        case "yards": return Unit.Yards;
        default: throw new System.ArgumentException("Incorrect conversion");
    }
 }

Итак, после этого мы можем исправить код:

Unit unit;
while (true)
{    
    Console.WriteLine("What conversion: Feet, Meters, Yards");

    try
    {
        var input = Console.ReadLine();
        unit = Values.Input(convert);
        break; // if we get here we didn't throw an exception, so we can exit the loop
    }
    catch
    {
        Console.WriteLine("Incorrect conversion");
    }
}

Console.WriteLine("Continue on");
Console.ReadLine();
...