Правильный способ в Python вызывать ошибки при установке переменных

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
25
задан pfctdayelise 18 April 2011 в 01:58
поделиться

3 ответа

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

  • Не используйте исключение NameError , оно используется только тогда, когда имя, как сказано в самом исключении, не найдено в локальной или глобальной области, используйте ValueError или TypeError , если исключение касается значения или типа параметра;

  • Не печатать сообщения об ошибках. Вызов значимых исключений с помощью значимого сообщения об ошибке:

     raise ValueError («пароль должен быть длиннее 6 символов») 
     
  • Возвращать значение из установщика бессмысленно, пока присваивание не является выражением, т. Е. Вы не удается проверить значение присваивания:

     if (user.password = 'short'): ... 
     
  • Просто вызовите исключение в установщике и позвольте коду, устанавливающему свойство, обработать его .

Пример:

class Test:

    minlen = 6

    @property
    def password(self):
        return self._password

    @password.setter
    def password(self, value):
        if not isinstance(value, basestring):
            raise TypeError("password must be a string")
        if len(value) < self.minlen:
            raise ValueError("password must be at least %d character len" % \
                                 self.minlen)
        self._password = value

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

43
ответ дан 28 November 2019 в 04:54
поделиться

Стандартный способ сообщения об ошибке в python состоит в том, чтобы вызвать исключение и позволить вызывающему коду его обработать. Либо пусть NameError & amp; Ошибка типа продолжить вверх или перехватить их и вызвать исключение InvalidPassword, которое вы определяете.

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

Вы также никогда не должны печатать сообщение для пользователя при обработке исключений - что если вы позже захотите использовать функцию или класс в программе с графическим интерфейсом? В этом случае вашему заявлению на печать будет некуда печатать. Регистрация ошибки в лог-файл (с использованием модуля журналирования Python) часто полезна для отладки.

10
ответ дан Dave Kirby 18 April 2011 в 01:58
поделиться

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

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

print обычно не является хорошим ответом на ошибку. В этом случае похоже, что вы хотите сказать конечному пользователю, что ему нужно использовать другой пароль. Похоже, вы должны вызвать метод, который заставляет веб-страницу с формой объяснять пользователю, что пошло не так; вы можете вызвать метод, который делает это в вашем классе, или вызвать исключение, которое будет распространяться и в конечном итоге быть поймано и использовано для этой цели. (Это общий совет. Я недостаточно знаю о Pylons, чтобы рассказать вам, как он хочет, чтобы вы это делали.)

Вы не должны создавать свои собственные исключения NameError . NameError в значительной степени всегда указывает на опечатку в вашей программе, и поэтому вы обычно не хотите ее обнаруживать. Улавливая это, вы вносите в программу ненужную неопределенность. Похоже, это может быть что-то вроде ValueError или его подкласс ( class InvalidPasswordError (ValueError): pass ).

Я не понимаю, почему вы проверяете TypeError . Вы всегда должны понимать, что вызвало бы исключение, которое вы поймали.Если вы это сделаете в этом случае, это здорово; Я не могу понять, какая ошибка вызовет TypeError , с которой можно было бы разумно справиться, запросив пользователя.

Ваш метод получения пароля в виде открытого текста и сохранения его хэша md5 не очень безопасен. Вам следует изучить что-то вроде AuthKit, которое могло бы сделать этот процесс более безопасным и абстрактным.

4
ответ дан 28 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: