Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Ваш код находится вне контекста, поэтому правильный выбор не очевиден. Следуя некоторым советам:
Не используйте исключение 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
Посмотрите также на эту библиотеку обработки форм , там валидаторы, здесь пример , являются собственными сущностями: они могут быть установлены динамически с более высоким контролем и менее связанный код, но, возможно, это намного больше, чем вам нужно.
Стандартный способ сообщения об ошибке в python состоит в том, чтобы вызвать исключение и позволить вызывающему коду его обработать. Либо пусть NameError & amp; Ошибка типа продолжить вверх или перехватить их и вызвать исключение InvalidPassword, которое вы определяете.
Хотя из функции можно возвращать флаг успеха / неудачи или код ошибки, как вы это сделали, это не рекомендуется - вызывающий может легко забыть проверить возвращаемое значение и получить ошибки. потерял. Кроме того, вы возвращаете значение из установщика свойств - это бессмысленно в Python, поскольку присваивания не являются выражениями и не могут возвращать значение.
Вы также никогда не должны печатать сообщение для пользователя при обработке исключений - что если вы позже захотите использовать функцию или класс в программе с графическим интерфейсом? В этом случае вашему заявлению на печать будет некуда печатать. Регистрация ошибки в лог-файл (с использованием модуля журналирования Python) часто полезна для отладки.
Как правило, вы должны указывать ошибки, которые распространяются с помощью исключений. Если вы обнаружите ошибку в чем-то, что вы только что проверили, и можете немедленно с ней справиться, нет необходимости создавать исключение.
В частном случае сеттера, например, возврат False
или что-то еще не поможет. Установка переменных экземпляра, которые вы должны проверить, очень неоптимальна, поскольку в этом случае вы можете случайно пропустить ошибку.
print
обычно не является хорошим ответом на ошибку. В этом случае похоже, что вы хотите сказать конечному пользователю, что ему нужно использовать другой пароль. Похоже, вы должны вызвать метод, который заставляет веб-страницу с формой объяснять пользователю, что пошло не так; вы можете вызвать метод, который делает это в вашем классе, или вызвать исключение, которое будет распространяться и в конечном итоге быть поймано и использовано для этой цели. (Это общий совет. Я недостаточно знаю о Pylons, чтобы рассказать вам, как он хочет, чтобы вы это делали.)
Вы не должны создавать свои собственные исключения NameError
. NameError
в значительной степени всегда указывает на опечатку в вашей программе, и поэтому вы обычно не хотите ее обнаруживать. Улавливая это, вы вносите в программу ненужную неопределенность. Похоже, это может быть что-то вроде ValueError
или его подкласс ( class InvalidPasswordError (ValueError): pass
).
Я не понимаю, почему вы проверяете TypeError
. Вы всегда должны понимать, что вызвало бы исключение, которое вы поймали.Если вы это сделаете в этом случае, это здорово; Я не могу понять, какая ошибка вызовет TypeError
, с которой можно было бы разумно справиться, запросив пользователя.
Ваш метод получения пароля в виде открытого текста и сохранения его хэша md5 не очень безопасен. Вам следует изучить что-то вроде AuthKit, которое могло бы сделать этот процесс более безопасным и абстрактным.