2011-02-09 5 views

ответ

82

Лучше весьма субъективны. Например, я лично предпочитаю int.TryParse, так как мне часто все равно почему синтаксический анализ не удался, если он терпит неудачу. Однако int.Parse может (в соответствии с documentation) бросить три исключения:

  • вход нуля
  • вход не в правильном формате
  • входа содержит число, procudes переполнения

Если вам небезразлично, почему это не удается, то int.Parse, безусловно, лучший выбор.

Как всегда, контекст - это король.

+1

Хотя я согласен с общей мыслью о том, что контекст является королем, я бы сказал, что TryParse * почти всегда * лучше, это немного больше, чем очень субъективное личное предпочтение. Ваш контрпример (различая различные исключения, которые могут быть выброшены) довольно необычен и, вероятно, лучше кодируется блоком catch для каждого типа исключений, а не для всех catch. – Joe

+1

@Joe: да, если вы хотите различать разные типы исключений, все остальное, кроме определенных блоков catch, кажется очень странным. Мой ответ был направлен на обсуждение «Парса» и «TryParse», а не конкретных образцов кода в вопросе. Как я уже упоминал в других комментариях, я согласен с тем, что «TryParse» почти всегда * лучший путь, но ключевое слово «почти», а не «всегда». –

+0

@ Joe: Я уже сделал этот аргумент. См. Комментарии к исходному вопросу. Право Фредрика об абсолютных утверждениях никогда не бывает правдой. (OMG парадокс!) –

10

Первый. Второй считается кодированием по исключению.

8

Лично я предпочел бы:

if (int.TryParse(string, out num)) 
{ 
    ... 
} 
4

первым! Вы не должны кодировать по исключению.

вы могли бы сократить его

if (int.TryParse(string, out num))

3

Во-первых, на сегодняшний день. Как сказал Джордж, во-вторых, кодирование по исключению и имеет серьезные последствия для производительности. И производительность должна быть проблемой, всегда.

2

Захват Исключения имеет больше накладных расходов, поэтому я пойду на TryParse.

Плюс, метод TryParse не генерирует исключения, если преобразование не выполняется. Это устраняет необходимость использования обработки исключений для проверки исключения FormatException в случае, если s недействителен и не может быть успешно проанализирован.

Это последняя часть копирования вставки из here

37

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

+1

Мне нравится это объяснение, потому что я разбираю много пользовательских данных, и ожидается ли отказ или нет (и что делать, когда это произойдет) формирует весь проект. – JYelton

+0

Эрик, мне было бы интересно услышать ваши мысли по адресу http://www.boost.org/community/error_handling.html: «« Это исключительная (или неожиданная) ситуация? »« Это руководство имеет привлекательное кольцо к нему, но обычно это ошибка ... Более подходящий вопрос, который нужно задать: '' мы хотим, чтобы стека здесь разворачивалась? '' " – Jon

+0

@Jon: На память приходят несколько вещей. Во-первых, вы не можете спорить с тавтологией о том, что исключения правильны в тех ситуациях, когда вы хотите поведение исключения, но вы также ничего не можете узнать от него. Во-вторых, что «исключительные» и «неожиданные» - это две разные вещи. И в-третьих, кто говорит, что раскрутка стека имеет к этому какое-то отношение? Это деталь реализации C#. Исключения, вызванные асинхронными методами, не разматывают стек; стек уже давно ушел. Они сигнализируют о том, что произошло исключительное событие. Не путайте семантику с реализацией. –

1

Что-то еще, о чем следует помнить, заключается в том, что исключения записываются в журнал (необязательно) в окне отладки/вывода Visual Studio. Даже если издержки на производительность исключений могут быть незначительными, написание строки текста для каждого исключения, когда отладка может замедлить работу.Более примечательные исключения могут быть заглушены среди всех шумов неудачных целых операций синтаксического анализа.

15

Если это действительно ожидается, что преобразование иногда терпят неудачу, я хотел бы использовать int.TryParse и такие аккуратно на одной линии с conditional (Ternary) operator, как это:

int myInt = int.TryParse(myString, out myInt) ? myInt : 0; 

В этом случае нулевой будет использоваться в качестве значение по умолчанию, если метод TryParse терпит неудачу.

Также очень полезно для типов с нулевым значением, которые будут перезаписаны любым значением по умолчанию null, если преобразование завершится с ошибкой.

+0

Это точно эквивалентно: 'int myInt; int.TryParse (myString, out myInt); '. TryParse() уже устанавливает результат на 0 при ошибке. –

+3

Правильно, но с моей версией вы можете указать * альтернативное * значение по умолчанию, например '10'. – greg84

Смежные вопросы