Рефакторинг для удаления try / catch - PullRequest
4 голосов
/ 12 января 2010

Есть какие-нибудь идеи о хорошем способе рефакторинга, чтобы мой код действовал так же, но без единого исключения и отлова моего собственного исключения?

public Int32 ChooseNextColor(Int32 numColors)
{
    int? nextColor = null;

    while (nextColor == null)
    {
        Console.Write("Please enter your next color selection: ");
        string input = Console.ReadLine();

        try
        {
            nextColor = Convert.ToInt32(input);
            if (nextColor > numColors || nextColor < 0) 
                throw new ArgumentOutOfRangeException();
        }
        catch
        {
            nextColor = null;
            Console.WriteLine("Unrecognized input: " + input);
            Console.WriteLine("Please enter a value between 0 and " + numColors + ".");
        }
    }

    return (nextColor.Value);
}

РЕДАКТИРОВАТЬ : Метод try / parse - именно то, что я ищу.

В ответ на редактирование заголовка Джона -> я должен был опубликовать больше информации для начала, и это было бы "лучше всего избавиться от попытки поймать все вместе" Поэтому, помня об этом, я сменил название.

Ответы [ 6 ]

14 голосов
/ 12 января 2010

Попробуйте

int nextColor;
input = Console.ReadLine();

while( ! Int32.TryParse( input, out nextColor ) 
       || nextColor > numColors 
       || nextColor < 0 )
{ 
    Console.WriteLine("Unrecognized input: " + input);
    Console.WriteLine("Please enter a value between 0 and " + numColors + ".");
    input = Console.ReadLine();
}
4 голосов
/ 12 января 2010

предупреждение, не проверено!

public int ChooseNextColor(int numColors)
{
    while (true)
    {
        Console.Write("Please enter your next color selection: ");
        string input = Console.ReadLine();
        int color;
        if (!int.TryParse(input, out color) || color > numColors || color < 0)
        {
            Console.WriteLine("Unrecognized input: " + input);
            Console.WriteLine("Please enter a value between 0 and " + numColors + ".");
        }
        else
        {
            return color;
        }
    }
}
2 голосов
/ 12 января 2010

.NET предоставляет TryParse именно по этой причине.

1 голос
/ 12 января 2010
    public Int32 ChooseNextColor(Int32 numColors)
    {
        var success = false;
        while (!success)
        {
            Console.Write("Please enter your next color selection: ");
            int nextColor;
            var input = Console.ReadLine();
            success = int.TryParse(input, out nextColor);

            if (success && nextColor > 0 && nextColor < numColors) return nextColor;

            Console.WriteLine("Unrecognized input: " + input);
            Console.WriteLine("Please enter a value between 0 and " + numColors + ".");
        }
        throw new ApplicationException("The thing that should not be.");
    }
1 голос
/ 12 января 2010

Если вы хотите избежать исключения, вы должны использовать метод int.TryParse вместо Convert.ToInt32 ().

1 голос
/ 12 января 2010

Вы можете использовать Int32.TryParse() или

if (nextColor > numColors || nextColor < 0) 
    {
        Console.WriteLine("Unrecognized input: " + input);
        Console.WriteLine("Please enter a value between 0 and " + numColors + ".");
        return null;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...