Обработка исключений и предотвращение их возникновения в первую очередь - C # - PullRequest
1 голос
/ 10 февраля 2009

У меня есть asp: BoundColumn с DateTime? данные (я назову это столбцом X) в asp: GridView. Я перебираю все строки в сетке и преобразую свойство .Text в столбец X в DateTime (мне нужно это сделать, чтобы выполнить некоторую проверку и изменить цвет фона ячейки, если это необходимо).

У меня есть 2 варианта:

  1. переносит приведение в try / catch ... обрабатывает FormatException (в случае, если столбец X отображается с некоторым мусором) ... и работает только с действительными значениями DateTime.

  2. проверьте столбец X, чтобы убедиться, что в правильном формате (как?) перед тем корпус, и приведение только если формат ок.

Какой подход мне выбрать и почему?

Спасибо.

p.s. 1 голос за все объяснения, принятый ответ для TryParse

Edit2: хотя я использовал TryParse, я снял флажок с принятым ответом, чтобы продолжить обсуждение.

Мое соотношение «хорошие данные» / «плохие данные» составляет около 2/1 - это означает, что много плохих данных

Я приму ответ через пару дней, если ничего не выйдет.

Ответы [ 7 ]

13 голосов
/ 10 февраля 2009

Вы можете сделать 2-й вариант. DateTime.TryParse может помочь.

3 голосов
/ 10 февраля 2009

Я бы пошел на второй вариант. Я никогда не использую исключения для обычного кода, потому что тогда я могу работать с опцией visual studio "врываться в отладчик при возникновении исключения".

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

3 голосов
/ 10 февраля 2009

Я думаю, это немного зависит от того, как часто вы ожидаете, что он будет в неправильном формате. Оборачивание чего-либо в try-catch на самом деле не оказывает никакого влияния, если исключение возникает редко. Но если вы ожидаете, что он будет повышен, то вам, возможно, стоит добавить к нему чек.

2 голосов
/ 10 февраля 2009

Правило, которому я следую: Всегда старайтесь отлавливать столько ошибок вручную, сколько можете, и используйте исключения как последнее средство.

Исключения влияют на производительность.

2 голосов
/ 10 февраля 2009

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

1 голос
/ 10 февраля 2009

Следует отметить, что TryParse не обязательно будет иметь лучшую производительность, чем Try Catch вокруг вашего "Parse".

Это зависит от вашей частоты отказов. Try-Catch оказывают влияние на производительность, хотя в большинстве случаев это происходит, когда вы терпите неудачу. Однако, если у вас есть 95% -ный успех или даже выше, и производительность является соображением, тогда вы можете подумать о том, чтобы обернуть ваш цикл в try-catch, чтобы вы выполняли оператор try только при отказ.

int i = 0;
List<String> prePopulated;
List<DateTime> toPopulate;

while(i < prepopulated.Length)
{
   Try
   {
      while(i < prepopulated.Length)
      {
         List<DateTime>.add(DateTime.Parse(prePopulated[i]));
         i++;
      }
   }
   Catch(Exception ex)
   {
      //log if necessary
      i++;
   }
}

Имейте в виду, что решение лучше только в том случае, если ваши данные в основном чистые и производительность является ключевой. В противном случае лучше использовать одну строку «TryParse».

0 голосов
/ 10 февраля 2009

Я согласен с DateTime.TryParse. Я работаю над сайтом очень большого объема, и нам никогда не разрешается перехватывать исключения в пользовательском интерфейсе !, что помогает нам предотвращать ошибки. Мы очень стараемся, чтобы вызываемый код не выдавал исключений.

...