Manejo de excepciones
La clave para manejar excepciones en Python está en la palabra reservada try. La estrategia para un manejo exitoso es:
- Intentar hacer algo (
try). - Comprobar si todo salió bien.
Aunque puede parecer más lógico verificar primero las circunstancias antes de realizar cualquier acción, como se muestra en el siguiente ejemplo:
numero1 = int(input("Ingresa el primer número: "))
numero2 = int(input("Ingresa el segundo número: "))
if numero2 != 0:
print(numero1 / numero2)
else:
print("Esta operación no puede ser realizada.")
print("FIN.")
Este enfoque, aunque comprensible, puede llevar a un código más extenso y menos legible. Python prefiere un enfoque más simple y eficiente, donde el manejo de errores ocurre directamente cuando algo sale mal, en lugar de revisar exhaustivamente todas las posibles circunstancias.
Las instrucciones try-except
El enfoque favorito de Python: try y except
El manejo de excepciones en Python sigue este enfoque preferido, utilizando las palabras clave try y except. A continuación, se detalla cómo funciona:
try: Este bloque contiene el código que Python intentará ejecutar. Puede funcionar correctamente o generar una excepción.except: Si ocurre una excepción en el bloquetry, Python salta a este bloque para manejar el error de manera adecuada.
Ejemplo resumido:
try:
# Código que puede fallar
except:
# Código que maneja el fallo
- Python ejecuta todas las instrucciones dentro del bloque
try. Si todo sale bien, el flujo salta al final del bloqueexcept, y el manejo de excepciones finaliza. - Si algo falla en el bloque
try, Python interrumpe la ejecución de ese bloque y salta al bloqueexceptpara manejar el error. Esto puede hacer que algunas instrucciones dentro deltryse omitan.
El uso de try-except permite manejar excepciones sin necesidad de comprobar manualmente cada situación, haciendo el código más legible y manejable.
Ejemplo:
try:
print("1")
x = 1 / 0
print("2")
except:
print("Oh cielos, algo salió mal...")
print("3")
Manejando varias excepciones
El enfoque básico de manejo de excepciones con try-except tiene una desventaja significativa: cuando varias excepciones pueden ocurrir, un único bloque except no proporciona detalles específicos sobre lo que realmente salió mal.
Por ejemplo, considera el siguiente código:
try:
x = int(input("Ingresa un número: "))
y = 1 / x
print (y)
except:
print("Oh cielos, algo salió mal...")
El mensaje “Oh cielos, algo salió mal…” no ofrece información útil sobre la causa del fallo, pero en este caso hay dos posibles razones para la excepción:
- El usuario ingresó datos no válidos que no pueden convertirse en un entero.
- Se intentó dividir entre cero (cuando el usuario ingresó
0).
Hay dos formas de abordar este problema:
- Usar bloques
try-exceptconsecutivos: Cada uno maneja un tipo de excepción diferente. Este método es fácil, pero puede hacer que el código sea largo e innecesariamente complejo. - Usar múltiples bloques
exceptpara manejar diferentes excepciones dentro del mismotry:
try:
x = int(input("Ingresa un número: "))
y = 1 / x
print (y)
except ValueError:
print("Error: Datos no válidos, ingresa un número entero.")
except ZeroDivisionError:
print("Error: No puedes dividir entre cero.")
except:
print("Oh cielos, algo salió mal...")
- Si el bloque
trygenera una excepción específica, comoValueErroroZeroDivisionError, será manejada por el bloque correspondiente. - Los bloques
exceptson analizados en el mismo orden en que aparecen en el código. - No debes usar más de un bloque de excepción con el mismo nombre.
- El número de diferentes bloques
exceptes arbitrario, la única condición es que si se emplea eltry, debes poner al menos unexcept(nombrado o no) después de el. - La palabra clave reservada
exceptno debe ser empleada sin que le preceda untry. - Si uno de los bloques
exceptes ejecutado, ningún otro lo será. - Si ninguno de los bloques
exceptespecificados coincide con la excepción planteada, la excepción permanece sin manejar (lo discutiremos pronto). - Si un
exceptsin nombre existe, tiene que especificarse como el último. - Si ocurre cualquier otra excepción no especificada, será manejada por el bloque genérico
except.
Este método proporciona mayor control y permite manejar cada error de manera adecuada sin hacer crecer el código de forma innecesaria.