Рефакторинг для удаления try/catch

Любые идеи о хорошем способе реорганизации этого, чтобы мой код действовал так же, но без всего выбрасывания и перехвата моего собственного исключения?

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);
}

EDIT: метод try/parse — это именно то, что я ищу.

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


person Nick Larsen    schedule 11.01.2010    source источник
comment
Джон, я не уверен, что это хорошая редакция названия. Вопрос касается без... выбрасывания и перехвата моего собственного исключения, которое, как мне кажется, предполагает, что он спрашивает о том, как обрабатывать проверку диапазона (его ArgumentOutOfRangeException), а не целочисленный синтаксический анализ.   -  person itowlson    schedule 12.01.2010
comment
Все ответы касаются int.TryParse, поэтому мне придется не согласиться, пока ОП не прояснит ситуацию.   -  person John Saunders    schedule 12.01.2010
comment
См. но без полного генерирования и перехвата моего собственного исключения. То, что большинство ответов не отвечают на первоначальный вопрос, не должно быть причиной для изменения вопроса.   -  person Sander Rijken    schedule 12.01.2010
comment
Видел это, видел ответы, ждал, когда ОП расскажет нам, чтобы мы могли перестать гадать.   -  person John Saunders    schedule 12.01.2010
comment
Большинство вопросов не отвечали на мой первоначальный вопрос, но я также не предоставил достаточно информации в вопросе для начала. Удаление try/catch — действительно лучший ответ, который я искал. Голосую за указание на отсутствие информации.   -  person Nick Larsen    schedule 12.01.2010


Ответы (5)


Пытаться

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();
}
person Paul Alexander    schedule 11.01.2010
comment
Кажется, это не выполняет проверку диапазона исходного кода... я что-то упустил? - person itowlson; 12.01.2010
comment
это не проверяет, находится ли ввод между 0 и numColors. - person tster; 12.01.2010
comment
Не избавляет ли от выброса за пределы диапазона, когда его ‹ 0? - person Sander Rijken; 12.01.2010
comment
Верно... добавлена ​​проверка диапазона. - person Paul Alexander; 12.01.2010
comment
Я надеюсь, что первоначальный пользователь сможет понять, как добавить проверку диапазона в существующий код @Paul. - person user7116; 12.01.2010
comment
Вопрос был о том, как избавиться от try/catch, используемого для проверки диапазона, а не об исключениях из Convert.ToInt32() - person Sander Rijken; 12.01.2010
comment
Мне действительно не нравится идея иметь 2 оператора readline в одной и той же функции, но это лучший ответ. +1 за краткий код, я буду использовать что-то, слегка переработанное из этого. - person Nick Larsen; 12.01.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;
        }
    }
}
person tster    schedule 11.01.2010

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

person Anon.    schedule 11.01.2010
comment
Не избавляет ли от выброса за пределы диапазона, когда его ‹ 0? - person Sander Rijken; 12.01.2010
comment
Он пытается обойти создание собственного исключения и перехватить его, а не только исключение, созданное Convert.ToInt32. - person tster; 12.01.2010
comment
Как только исключение, вызванное Parse, исчезнет, ​​элементарным изменением станет полное удаление try/catch. Если нужно, считайте это оставленным читателю в качестве упражнения. - person Anon.; 12.01.2010
comment
Но в этом и был весь смысл его вопроса. Он ничего не сказал об исключении из Convert.ToInt32 - person tster; 12.01.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;
    }
person alemjerus    schedule 11.01.2010

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

person Vitaly    schedule 11.01.2010
comment
Не избавляет ли от выброса за пределы диапазона, когда его ‹ 0? - person Sander Rijken; 12.01.2010