Python 3 - Manejo de excepciones
Python proporciona dos características muy importantes para manejar cualquier error inesperado en sus programas de Python y para agregar capacidades de depuración en ellos:
Exception Handling- Esto se trataría en este tutorial. Aquí hay una lista de Excepciones estándar disponibles en Python: Excepciones estándar .
Assertions- Esto se trataría en el tutorial Afirmaciones en Python 3 .
Excepciones estándar
Aquí hay una lista de excepciones estándar disponibles en Python. -
No Señor. | Nombre y descripción de la excepción |
---|---|
1 | Exception Clase base para todas las excepciones |
2 | StopIteration Se genera cuando el método next () de un iterador no apunta a ningún objeto. |
3 | SystemExit Generado por la función sys.exit (). |
4 | StandardError Clase base para todas las excepciones integradas excepto StopIteration y SystemSalir. |
5 | ArithmeticError Clase base para todos los errores que ocurren para el cálculo numérico. |
6 | OverflowError Se genera cuando un cálculo excede el límite máximo para un tipo numérico. |
7 | FloatingPointError Se genera cuando falla un cálculo de punto flotante. |
8 | ZeroDivisonError Se genera cuando se realiza una división o módulo por cero para todos los tipos numéricos. |
9 | AssertionError Se genera en caso de falla de la declaración Assert. |
10 | AttributeError Se genera en caso de falla de referencia o asignación de atributo. |
11 | EOFError Se genera cuando no hay entrada de la función raw_input () o input () y se alcanza el final del archivo. |
12 | ImportError Se genera cuando falla una declaración de importación. |
13 | KeyboardInterrupt Se genera cuando el usuario interrumpe la ejecución del programa, generalmente presionando Ctrl + c. |
14 | LookupError Clase base para todos los errores de búsqueda. |
15 | IndexError Se genera cuando no se encuentra un índice en una secuencia. |
dieciséis | KeyError Se genera cuando la clave especificada no se encuentra en el diccionario. |
17 | NameError Se genera cuando no se encuentra un identificador en el espacio de nombres local o global. |
18 | UnboundLocalError Se genera cuando se intenta acceder a una variable local en una función o método, pero no se le ha asignado ningún valor. |
19 | EnvironmentError Clase base para todas las excepciones que ocurren fuera del entorno de Python. |
20 | IOError Se genera cuando falla una operación de entrada / salida, como la declaración de impresión o la función open () al intentar abrir un archivo que no existe. |
21 | OSError Criado por errores relacionados con el sistema operativo. |
22 | SyntaxError Se genera cuando hay un error en la sintaxis de Python. |
23 | IndentationError Se eleva cuando la sangría no se especifica correctamente. |
24 | SystemError Se genera cuando el intérprete encuentra un problema interno, pero cuando se encuentra este error, el intérprete de Python no sale. |
25 | SystemExit Se genera cuando se cierra el intérprete de Python mediante la función sys.exit (). Si no se maneja en el código, hace que el intérprete salga. |
26 | TypeError Se genera cuando se intenta una operación o función que no es válida para el tipo de datos especificado. |
27 | ValueError Se genera cuando la función incorporada para un tipo de datos tiene el tipo válido de argumentos, pero los argumentos tienen valores no válidos especificados. |
28 | RuntimeError Se genera cuando un error generado no entra en ninguna categoría. |
29 | NotImplementedError Se genera cuando un método abstracto que debe implementarse en una clase heredada no se implementa realmente. |
Afirmaciones en Python
Una afirmación es una verificación de cordura que puede activar o desactivar cuando haya terminado con la prueba del programa.
La forma más fácil de pensar en una afirmación es compararla con una raise-ifdeclaración (o para ser más precisos, una declaración de aumento si no). Se prueba una expresión y, si el resultado es falso, se genera una excepción.
Las afirmaciones se llevan a cabo mediante la declaración assert, la palabra clave más nueva de Python, introducida en la versión 1.5.
Los programadores a menudo colocan aserciones al comienzo de una función para verificar una entrada válida, y después de una llamada de función para verificar una salida válida.
La declaración de aserción
Cuando encuentra una declaración de aserción, Python evalúa la expresión que la acompaña, que es de esperar que sea verdadera. Si la expresión es falsa, Python genera una excepción AssertionError .
La sintaxis para aseverar es:
assert Expression[, Arguments]
Si la aserción falla, Python usa ArgumentExpression como argumento para AssertionError. Las excepciones AssertionError pueden detectarse y manejarse como cualquier otra excepción, utilizando la declaración try-except. Si no se manejan, terminarán el programa y producirán un rastreo.
Ejemplo
Aquí hay una función que convierte una temperatura dada de grados Kelvin a grados Fahrenheit. Dado que 0 ° K es tan frío como se pone, la función se rescata si ve una temperatura negativa:
#!/usr/bin/python3
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))
Cuando se ejecuta el código anterior, produce el siguiente resultado:
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
¿Qué es la excepción?
Una excepción es un evento que ocurre durante la ejecución de un programa que interrumpe el flujo normal de las instrucciones del programa. En general, cuando una secuencia de comandos de Python encuentra una situación que no puede afrontar, genera una excepción. Una excepción es un objeto de Python que representa un error.
Cuando una secuencia de comandos de Python genera una excepción, debe manejar la excepción inmediatamente, de lo contrario, termina y se cierra.
Manejando una excepción
Si tiene algún código sospechoso que pueda generar una excepción, puede defender su programa colocando el código sospechoso en untry:bloquear. Después del bloque try:, incluya unexcept: declaración, seguida de un bloque de código que maneja el problema de la manera más elegante posible.
Sintaxis
Aquí hay una sintaxis simple de try .... excepto ... bloques else -
try:
You do your operations here
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
Aquí hay algunos puntos importantes sobre la sintaxis mencionada anteriormente:
Una sola declaración try puede tener varias declaraciones except. Esto es útil cuando el bloque try contiene declaraciones que pueden generar diferentes tipos de excepciones.
También puede proporcionar una cláusula except genérica, que maneja cualquier excepción.
Después de la (s) cláusula (s) except, puede incluir una cláusula else. El código del bloque else se ejecuta si el código del bloque try: no genera una excepción.
El bloque else es un buen lugar para el código que no necesita la protección de try: block.
Ejemplo
Este ejemplo abre un archivo, escribe contenido en el archivo, y sale con elegancia porque no hay ningún problema.
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print ("Error: can\'t find file or read data")
else:
print ("Written content in the file successfully")
fh.close()
Esto produce el siguiente resultado:
Written content in the file successfully
Ejemplo
Este ejemplo intenta abrir un archivo donde no tiene el permiso de escritura, por lo que genera una excepción:
#!/usr/bin/python3
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print ("Error: can\'t find file or read data")
else:
print ("Written content in the file successfully")
Esto produce el siguiente resultado:
Error: can't find file or read data
La cláusula except sin excepciones
También puede usar la declaración except sin excepciones definidas de la siguiente manera:
try:
You do your operations here
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
Este tipo de try-exceptdeclaración captura todas las excepciones que ocurren. Sin embargo, el uso de este tipo de declaración try-except no se considera una buena práctica de programación, ya que detecta todas las excepciones pero no hace que el programador identifique la causa raíz del problema que pueda ocurrir.
La cláusula except con múltiples excepciones
También puede usar la misma declaración except para manejar múltiples excepciones de la siguiente manera:
try:
You do your operations here
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
La cláusula de intentar finalmente
Puedes usar un finally: bloque junto con un try:bloquear. losfinally:block es un lugar para colocar cualquier código que deba ejecutarse, ya sea que el bloque try haya generado una excepción o no. La sintaxis de la declaración de intentar finalmente es la siguiente:
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
Note- Puede proporcionar cláusulas excepto, o una cláusula final, pero no ambas. No puede usar la cláusula else junto con una cláusula finalmente.
Ejemplo
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print ("Error: can\'t find file or read data")
fh.close()
Si no tiene permiso para abrir el archivo en modo de escritura, esto producirá el siguiente resultado:
Error: can't find file or read data
El mismo ejemplo se puede escribir de manera más clara de la siguiente manera:
#!/usr/bin/python3
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print ("Going to close the file")
fh.close()
except IOError:
print ("Error: can\'t find file or read data")
Esto produce el siguiente resultado:
Going to close the file
Cuando se lanza una excepción en el bloque try , la ejecución pasa inmediatamente al bloque finalmente . Después de que se ejecutan todas las declaraciones en el bloque finalmente , la excepción se genera nuevamente y se maneja en las declaraciones excepto si está presente en la siguiente capa superior de la declaración try-except .
Argumento de una excepción
Una excepción puede tener un argumento , que es un valor que brinda información adicional sobre el problema. El contenido del argumento varía según la excepción. Captura el argumento de una excepción proporcionando una variable en la cláusula except de la siguiente manera:
try:
You do your operations here
......................
except ExceptionType as Argument:
You can print value of Argument here...
Si escribe el código para manejar una sola excepción, puede hacer que una variable siga al nombre de la excepción en la declaración except. Si está capturando varias excepciones, puede hacer que una variable siga a la tupla de la excepción.
Esta variable recibe el valor de la excepción que contiene principalmente la causa de la excepción. La variable puede recibir un valor único o varios valores en forma de tupla. Esta tupla generalmente contiene la cadena de error, el número de error y una ubicación del error.
Ejemplo
A continuación se muestra un ejemplo de una única excepción:
#!/usr/bin/python3
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError as Argument:
print ("The argument does not contain numbers\n", Argument)
# Call above function here.
temp_convert("xyz")
Esto produce el siguiente resultado:
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
Plantear una excepción
Puede generar excepciones de varias formas utilizando la declaración de aumento. La sintaxis general de laraise declaración es la siguiente:
Sintaxis
raise [Exception [, args [, traceback]]]
Aquí, Exception es el tipo de excepción (por ejemplo, NameError) y argumento es un valor para el argumento de excepción. El argumento es opcional; si no se proporciona, el argumento de excepción es Ninguno.
El argumento final, rastreo, también es opcional (y rara vez se usa en la práctica) y, si está presente, es el objeto de rastreo que se usa para la excepción.
Ejemplo
Una excepción puede ser una cadena, una clase o un objeto. La mayoría de las excepciones que genera el núcleo de Python son clases, con un argumento que es una instancia de la clase. Definir nuevas excepciones es bastante fácil y se puede hacer de la siguiente manera:
def functionName( level ):
if level <1:
raise Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
Note- Para detectar una excepción, una cláusula "excepto" debe referirse a la misma excepción lanzada como un objeto de clase o una cadena simple. Por ejemplo, para capturar la excepción anterior, debemos escribir la cláusula except de la siguiente manera:
try:
Business Logic here...
except Exception as e:
Exception handling here using e.args...
else:
Rest of the code here...
El siguiente ejemplo ilustra el uso de generar una excepción:
#!/usr/bin/python3
def functionName( level ):
if level <1:
raise Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
try:
l = functionName(-10)
print ("level = ",l)
except Exception as e:
print ("error in level argument",e.args[0])
Esto producirá el siguiente resultado
error in level argument -10
Excepciones definidas por el usuario
Python también le permite crear sus propias excepciones derivando clases de las excepciones estándar integradas.
Aquí hay un ejemplo relacionado con RuntimeError . Aquí, se crea una clase que se subclasifica de RuntimeError . Esto es útil cuando necesita mostrar información más específica cuando se detecta una excepción.
En el bloque try, la excepción definida por el usuario se genera y se captura en el bloque except. La variable e se usa para crear una instancia de la clase Networkerror .
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
Entonces, una vez que haya definido la clase anterior, puede generar la excepción de la siguiente manera:
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args