Это хорошая или плохая идея - выдавать исключения при проверке данных? - PullRequest
58 голосов
/ 01 октября 2009

При проверке данных у меня появилась привычка делать следующее:

Примечание: У меня нет отдельных логических значений для каждого чека. Это только для примера.

Другое примечание: любая обработка ошибок во время тестов выполняется правильно. ЕДИНСТВЕННЫЕ исключения, добавленные в try-catch, - мои собственные.

try {
  if (validCheckOne = false) {
    throw new Exception("Check one is bad");
  }
  if (validCheckTwo = false) {
    throw new Exception("Failed because of check2");
  }
  if(validCheckTen = false) {
    throw new Exception("Yet another failure on your part: check10.");
  }
} catch(Exception e) {
  MessageBox.Show("Your stupid data is wrong! See for yourself: " + e.Message);
}

Это плохая практика? Вызывает ли исключение замедление выполнения программы или нецелесообразно?

Ответы [ 13 ]

1 голос
/ 01 октября 2009

Я в целом согласен с правилом "исключения должны быть исключительными", но я мог бы сделать исключение (ха!) Для Python, где может быть и эффективно, и считается хорошей практикой использовать try ... за исключением управления потоком.

См., Например, Использование исключений для других целей .

0 голосов
/ 10 марта 2019

Этот вопрос все еще интересен, в основном из-за ответов.

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

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

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

Например, при работе с пользовательским вводом может произойти много странных случаев. Вставленные данные с веб-сайта, заполненного скрытыми символами (\ t \ n и т. Д.), Опечатками и действительно огромным количеством случаев, когда конкретное исключение может позволить более точный анализ или сообщение для использования гораздо точнее, чем простой «ложный» возврат .

0 голосов
/ 01 октября 2009

Это действительно имеет значение только в том случае, если проверка ваших данных находится в жестком цикле. В большинстве случаев не имеет значения, что вы выбираете, если вы последовательны в своем коде.

Если у вас много кода, похожего на приведенный выше пример, вы можете очистить его, введя вспомогательный метод throw ...

private void throwIf( bool condition, String message )
{
    if( condition )
        throw new ApplicationException( message );
}

(также это поможет сосредоточиться на таких ошибках, как «validCheckOne = false» и «validCheckOne == false»:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...