Лучше ли использовать исключения в классе «проверки» или кодах возврата? - PullRequest
7 голосов
/ 09 сентября 2010

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

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

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

Я читал несколько статей об использовании исключений , и я хотел бы узнать ваше мнение в моей ситуации: было бы неплохо использовать исключения?

Ответы [ 2 ]

10 голосов
/ 10 августа 2012

Это очень старый вопрос, но так как единственный ответ - IMO - не применим к Python, вот мое мнение.


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

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

Кроме того, в Python идиоматично использовать EAFP (просить прощения проще, чем разрешение = try-except), а не LBYL (смотри, прежде чем прыгнуть = if not A, B or C then).

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

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

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

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

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

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

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

HTH!

5 голосов
/ 09 сентября 2010

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

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