try tipos print predefined exceptions excepciones example errors error diferentes catch all python exception

tipos - ¿Una forma adecuada de aumentar la excepción en Python?



types errors python (3)

Ambos son apropiados; la última forma le permite adjuntar argumentos a su excepción:

if len(sys.argv) == 1: raise EmptyArgs(''Specify at least 1 argument'')

También puede pasar los argumentos como un segundo valor como una tupla en la declaración de aumento:

if len(sys.argv) == 1: raise EmptyArgs, (''Specify at least 1 argument'',)

pero un solo valor no tupla también funcionará, y se considera como un solo argumento:

if len(sys.argv) == 1: raise EmptyArgs, ''Specify at least 1 argument''

y un tercer valor para raise permite especificar un rastreo alternativo, que luego se usa en lugar del rastreo que se generaría para la ubicación actual en el código:

if len(sys.argv) == 1: raise EmptyArgs, (''Specify at least 1 argument'',), traceback_object

Vea la documentación para la declaración de raise .

Tenga en cuenta que cuando utiliza argumentos para su excepción, el PEP 8 de la guía de estilo de Python prefiere que proporcione una instancia de excepción y no una clase:

Cuando raise ValueError(''message'') una excepción, use raise ValueError(''message'') lugar de la forma más antigua raise ValueError, ''message'' .

Se prefiere el formulario de uso de paréntesis porque cuando los argumentos de excepción son largos o incluyen el formato de cadena, no es necesario utilizar caracteres de continuación de línea gracias a los paréntesis que lo contienen. La forma más antigua se eliminará en Python 3.

Python 3 ya no admitirá esa forma.

Aquí está el código simple:

import sys class EmptyArgs(StandardError): pass if __name__ == "__main__": #first way to raise exception if len(sys.argv) == 1: raise EmptyArgs #second way to raise exception if len(sys.argv) == 1: raise EmptyArgs()

¿De qué manera es "más" correcto? Ambos estan trabajando
Nota: en mi código real, la excepción es exactamente la misma que declaré: sin mensaje ni argumentos.


Las dos formas son equivalentes; Ambos terminan lanzando una instancia de EmptyArgs . De la documentación :

Si el primer objeto es una clase, se convierte en el tipo de la excepción. El segundo objeto se usa para determinar el valor de la excepción: si es una instancia de la clase, la instancia se convierte en el valor de la excepción. Si el segundo objeto es una tupla, se usa como la lista de argumentos para el constructor de la clase; si es Ninguno, se usa una lista de argumentos vacía, y cualquier otro objeto se trata como un argumento único para el constructor. La instancia así creada llamando al constructor se usa como valor de excepción.

El "segundo objeto" mencionado anteriormente es el segundo argumento (opcional) para raise :

raise EmptyArgs, ''Invalid input!''


NO se recomienda elevar Excepciones sin argumentos, es decir, elevar la clase de excepción no es el camino a seguir. Solo haz algo como esto

raise MyException()

Porque en Python 3.0 se ha eliminado un caso similar para siempre.

raise Exception, "foo"

Debe haber una, y preferiblemente solo una, obvia forma de hacerlo.