Python中适当的方法在设置变量时引发错误

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的日志记录模块)通常对调试很有帮助.