str sentencias numeros letras declarar convertir caracter asignaciones python error-handling

sentencias - Forma correcta en Python para generar errores al configurar variables



str en python (3)

¿Cuál es la forma correcta de hacer una comprobación de errores en una clase? ¿Planteando excepciones? ¿Configurar un diccionario de variables de instancia "errores" que contenga todos los errores y devolverlo?

¿Es malo imprimir errores de una clase? ¿Tengo que devolver False si estoy generando una excepción?

Solo quiero asegurarme de que estoy haciendo las cosas bien. A continuación hay un código de ejemplo:

@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()


En general, debe indicar errores que se propagan utilizando excepciones. Si descubre un error por algo que acaba de marcar y puede resolverlo de inmediato, no es necesario que presente una excepción.

En el caso particular de un colocador, por ejemplo, devolver False o cualquier otra cosa no ayudará. La configuración de las variables de instancia que debe verificar es muy poco óptima, ya que entonces podría perder un error en un accidente.

print no suele ser una buena respuesta a un error. En este caso, parece que quiere decirle al usuario final que necesita usar una contraseña diferente. Parece que debe llamar a un método que hace que la página web con el formulario explique al usuario qué fue lo que salió mal; puede llamar al método que hace eso en su clase o generar una excepción que se propague y eventualmente se detecte y se use para ese propósito. (Este es un consejo general. No sé lo suficiente sobre los pilones para decirte cómo quiere que hagas esto).

No debe plantear sus propias excepciones de NameError . NameError prettymuch siempre indica un error tipográfico en su programa, y ​​como tal, por lo general no quiere atraparlo. Al atraparlo, introduces una incertidumbre innecesaria en un programa. Esto parece que podría ser algo más parecido a ValueError o una subclase del mismo ( class InvalidPasswordError(ValueError): pass ).

No entiendo por qué compruebas TypeError . Siempre debe comprender lo que podría haber causado una excepción que detectó. Si lo haces en este caso, eso es genial; No puedo averiguar qué error generaría TypeError que usted podría lidiar sin problemas al preguntarle al usuario.

Su técnica de recibir la contraseña en texto sin formato y almacenar su hash md5 no es muy segura. Debería mirar algo como AuthKit que podría hacer este proceso más seguro y abstracto.


La forma estándar de señalar un error en Python es generar una excepción y dejar que el código de llamada lo maneje. Deje que NameError y TypeError continúen hacia arriba, o cójalos y levante una excepción InvalidPassword que defina.

Si bien es posible devolver una marca de éxito / falla o un código de error de la función como lo ha hecho, no se recomienda: es fácil para la persona que llama olvidarse de verificar el valor de retorno y se pierden los errores. Además, está devolviendo un valor desde un establecedor de propiedades, esto no tiene sentido en Python, ya que las asignaciones no son expresiones y no pueden devolver un valor.

Además, nunca debe imprimir un mensaje para el usuario en su manejo de excepciones. ¿Qué sucede si más tarde desea usar la función o clase en un programa GUI? En ese caso, su declaración de impresión no tendrá ningún lugar para imprimir. Sin embargo, el registro de un error en un archivo de registro (usando el módulo de registro de Python) suele ser útil para la depuración.


Su código está fuera de contexto, por lo que no es obvio la elección correcta. Siguiendo algunos consejos:

  • No use la excepción NameError , solo se usa cuando no se encuentra un nombre, como dice la excepción, en el ámbito local o global, use ValueError o TypeError si la excepción se refiere al valor o al tipo del parámetro;

  • No imprima mensajes de error. Aumente las excepciones significativas con un mensaje de error significativo:

    raise ValueError("password must be longer than 6 characters")

  • Devolver un valor de un definidor no tiene sentido, mientras que la asignación no es una expresión, es decir, no puede verificar el valor de una asignación:

    if (user.password = ''short''): ...

  • Solo levante una excepción en el setter y deje que el código que establece la propiedad lo maneje.

Ejemplo:

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

Mire también esta biblioteca de manejo de formularios , aquí los validadores, aquí un ejemplo , son entidades en sí mismas: se pueden configurar dinámicamente con mayor control y menos código acoplado, pero tal vez esto sea mucho más de lo que necesita.