2010-09-08 3 views
6

Предположим, что я создаю класс для проверки числа, например «Социальное обеспечение» в США (как пример идентификатора страны). Существуют некоторые правила для проверки этого числа, которое поступает из ввода в виде html на веб-сайте.Лучше ли использовать исключения в классах проверки или возврата статуса?

Я думаю о создании простого класса в Python и общедоступном методе validate. Это validate возвращает True или False, просто. Этот метод будет вызывать другие небольшие частные методы (например, для первых «х» номеров, если существует другое правило), каждый из которых возвращает True или False.

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

Я читал some articles about using exceptions, и хотел бы узнать ваше мнение в моей ситуации: будет ли использование исключений хорошей идеей?

ответ

4

Если ввод действителен или нет, просто верните булево значение. Нет ничего исключительного в том, что тест валидации встречается с недопустимым значением.

+2

'raise NeitherValidNorInvalidException ('D:')' –

+0

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

+2

Ну, чтобы немного расшириться. Предположим, что у меня есть метод, который использует значение, например ErasePersonalIdentity (ssn), тогда было бы разумным, чтобы ssn был действительным. Если был предоставлен недействительный ssn, то было бы целесообразно привлечь исключение InvalidSSNException. Дело в том, что если операция требует действительного ввода, тогда исключение должно запускаться, когда предоставляется недопустимый ввод. Если операция проверяет ввод, то исключений нет. – csj

7

Это очень старый вопрос, но поскольку единственный ответ - ИМО - не применим к Python, сюда приходит мое взятие.


Исключения в Python - это то, о чем многие программисты, знакомые с языком, сталкиваются с трудностями. По сравнению с другими языками Python значительно отличается от того, как используются исключения: на самом деле Python обычно использует исключения для управления потоком.

Канонический пример является for цикл: вы, конечно, согласитесь, что нет ничего «однозначно странно» о петля исчерпав свои итерации (на самом деле это то, что все петли делать, если не работает) ... еще, а не проверять заблаговременно, если все еще есть значения для обработки, Python продолжает пытаться считывать значения из итерируемого, и, в противном случае, поднимает StopIterator exception, который, в свою очередь, улавливается выражением for и делает код, выходящий из цикла.

Кроме того, это идиоматическое в Python идти по ЭСПЦ (это проще попросить прощения, чем разрешения = try-except), а не LBYL (раз отмерь = if not A, B or C then).

В этом отношении ответ csj верен для C или Java, но не имеет отношения к Python (чьи исключения редко являются «исключительными» в природе).

Другой фактор, чтобы рассмотреть - хотя - это сценарий, в котором пользователь данные некорректны, но вы не в состоянии действовать на результатах функции проверки:

  • с return statement, не сумев обработать значение False приведет с вашими недействительными данными, отправленными по трубопроводу,
  • , в противном случае, если бы вы были raise Исключение, неспособное поймать его, приведет к тому, что исключение распространяется через ваш стек, в результате чего ваш код будет остановлен.

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

Снова. Использование исключений является вещий способ сделать (но это не относится к большинству других языков), а также изложены в this other answer и в zen of python:

Ошибки никогда не должны проходить молча.

Если явно не отключено.

HTH!

+0

Я не мог представить ситуацию, когда не удалось обработать False результат. Вы имеете в виду опечатку или что-то еще? Если небрежный разработчик смущает вывод оператора return, например, где-то, когда-нибудь, ошибка будет проходить молча, но с исключением, этого не произойдет? Что вы думаете о 'assert' [решение предоставлено] (http://stackoverflow.com/questions/3671450/is-it-better-to-use-exceptions-in-a-validation-class-or-return- статусные коды # comment3865104_3671488) by @katrielalex? –

+0

Q1: Я представляю какую-то опечатку, да. Q2: 'assert' - это ужасный способ управления потоком (кроме, возможно, и модульного тестирования). Например, все утверждения assert могут быть отключены, если интерпретатор python запускается в режиме оптимизации (python -O). Они полезны в режиме отладки, но повышение на 99% подходит ... – mac

+0

Небрежный разработчик? Все совершают ошибки. Кроме того, поэтому исключения были изобретены в первую очередь, что каждый устал проверять коды выхода в каждой строке, поскольку он имеет тенденцию делать код нечитаемым, и легко забыть проверить один из 20 вещей, которые могут пойти не так , С исключениями такие ошибки могут быть замечены в течение нескольких минут самим разработчиком, который его написал. – osa

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