ens*_*are 27 python error-handling
在课堂上进行错误检查的正确方法是什么?提出例外?设置包含所有错误并返回错误的实例变量字典"errors"?
从类中打印错误是不是很糟糕?如果我提出异常,我是否必须返回False?
只是想确保我做得对.以下是一些示例代码:
@property
def password(self):
return self._password
@password.setter
def password(self,password):
# Check that password has been completed
try:
# Check that password has a length of 6 characters
if (len(password) < 6):
raise NameError('Your password must be greater \
than 6 characters')
except NameError:
print 'Please choose a password'
return False
except TypeError:
print 'Please choose a password'
return False
#Set the password
self._password = password
#Encrypt the password
password_md5 = md5.new()
password_md5.update(password)
self._password_md5 = password_md5.hexdigest()
Run Code Online (Sandbox Code Playgroud)
mg.*_*mg. 43
您的代码不在上下文中,因此不是明显的正确选择.以下提示:
不要使用NameError异常,它仅在名称(如异常本身所说)在本地或全局范围内找不到时使用,ValueError或者TypeError如果异常涉及参数的值或类型,则使用它;
不要打印错误消息.使用有意义的错误消息提出有意义的异常:
raise ValueError("password must be longer than 6 characters")
Run Code Online (Sandbox Code Playgroud)从赋值器返回值是没有意义的,而赋值不是表达式,即您无法检查赋值的值:
if (user.password = 'short'): ...
Run Code Online (Sandbox Code Playgroud)只需在setter中引发异常,让设置属性的代码处理它.
例:
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
Run Code Online (Sandbox Code Playgroud)
再看一下这个表单处理库,验证器,这里是一个例子,它们是自己的实体:它们可以用更高的控制和更少的耦合代码动态设置,但也许这比你需要的要多得多.
Dav*_*rby 10
在python中发出错误信号的标准方法是引发异常并让调用代码处理它.让NameError和TypeError继续向上,或捕获它们并引发您定义的InvalidPassword异常.
虽然可以像您一样从函数返回成功/失败标志或错误代码,但不建议这样做 - 调用者很容易忘记检查返回值并丢失错误.除了你从属性设置器返回一个值 - 这在Python中是没有意义的,因为赋值不是表达式而不能返回值.
您也不应该在异常处理中为用户打印消息 - 如果您以后想要在GUI程序中使用该函数或类,该怎么办?在这种情况下,您的print语句无处可打印.将错误记录到日志文件(使用Python的日志记录模块)通常对调试很有帮助.