Должен ли метод проверки генерировать исключение? - PullRequest
7 голосов
/ 26 июля 2011

Я реализовал небольшую библиотеку проверки, которая используется следующим образом:

domain_object.validate()

# handle validation errors in some way ...
if domain_object.errors:
    for error in domain_object.errors:
        print(error)

validate() выполняет проверки и заполняет список с именем errors.

Я знаю из других библиотек проверки, что они выдают исключение, когда проверка выполняется неудачно. Сообщения об ошибках будут переданы как свойство исключения.

Какой подход лучше? Выгодно ли бросать исключения проверки?

Ответы [ 2 ]

8 голосов
/ 26 июля 2011

Нет, я не думаю, что метод валидации должен выдавать исключение.

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

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

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

5 голосов
/ 26 июля 2011

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

Исключения Python сделают эту проблему очевидной.

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