Saltar al contenido principal

Captura de excepciones

Anteriormente vimos fragmentos de código donde usábamos las funciones input e int para leer y analizar un número entero introducido por el usuario. Aquí un ejemplo para convertir una temperatura de grados Fahrenheit a grados Celsius:

ent = input('Introduzca la Temperatura Fahrenheit:')
fahr = float(ent)
cel = (fahr - 32.0) * 5.0 / 9.0
print(cel)

Si ejecutamos este código y le damos una entrada no válida, simplemente fallará con un mensaje de error:

$ python fahren.py
Introduzca la Temperatura Fahrenheit:72
22.2222222222

$ python fahren.py
Introduzca la Temperatura Fahrenheit:fred
Traceback (most recent call last):
File "fahren.py", line 2, in <module>
fahr = float(ent)
ValueError: invalid literal for float(): fred

Existen estructuras de ejecución condicional dentro de Python para manejar este tipo de errores esperados e inesperados, llamadas try/except. La idea de try y except es que si se sabe que cierta secuencia de instrucciones puede generar un problema, es posible añadir ciertas sentencias para que sean ejecutadas en caso de error. Estas sentencias extra (el bloque except) serán ignoradas si no se produce ningún error.

Podemos reescribir nuestro conversor de temperatura de esta forma:

ent = input('Introduzca la Temperatura Fahrenheit:')
try:
fahr = float(ent)
cel = (fahr - 32.0) * 5.0 / 9.0
print(cel)
except:
print('Por favor, introduzca un número')

Python comienza ejecutando la secuencia de sentencias del bloque try. Si todo va bien, se saltará todo el bloque except y terminará. Si ocurre una excepción dentro del bloque try, Python saltará fuera de ese bloque y se ejecutará la secuencia de sentencias del bloque except.

$ python fahren2.py
Introduzca la Temperatura Fahrenheit:72
22.2222222222

$ python fahren2.py
Introduzca la Temperatura Fahrenheit:fred
Por favor, introduzca un número

Gestionar una excepción con una sentencia try recibe el nombre de capturar una excepción. En este ejemplo, la cláusula except muestra un mensaje de error. En general, capturar una excepción te da la oportunidad de corregir el problema, volver a intentarlo, o al menos, terminar el programa con elegancia.

Dentro de la cláusula except podemos tener más de una sentencia, y esta puede realizar cualquier acción:

ent = input('Introduzca la Temperatura Fahrenheit:')
try:
fahr = float(ent)
cel = (fahr - 32.0) * 5.0 / 9.0
print(cel)
except:
print("Ocurrió un error")
print('Por favor, introduzca un número')

Reversión de sentencias

En Python, a diferencia de otros lenguajes, cuando se produce una excepción en un bloque try/except, las sentencias anteriores dentro del bloque hasta el punto donde se generó la excepción no son revertidas.

Por ejemplo:

sin_reversion = 1
try:
sin_reversion = 2
error = 5/0
sin_reversion = 3
except:
print("Se produjo un error")
print(sin_reversion) # Imprime: 2