Dominando el Manejo de Excepciones en Python: try, except, else y finally Explicados
Dominando el Manejo de Excepciones en Python: try, except, else y finally Explicados
Esta guía recorre los constructos de manejo de excepciones de Python con snippets de código prácticos y consejos de mejores prácticas.
Video: Manejo de Excepciones en Python (try..except..finally)
Excepciones en Python
Python lanza excepciones integradas cuando ocurre un error en tiempo de ejecución. El intérprete detiene el bloque actual de código y propaga la excepción hacia arriba en la pila de llamadas hasta encontrar un manejador. Si no existe ninguno, el programa termina e imprime un traceback.
Considera la siguiente cadena de llamadas: A llama a B, que llama a C. Si C lanza una excepción no manejada localmente, la excepción burbujea hacia B y luego a A. Las excepciones no manejadas resultan en un fallo abrupto del programa.
Capturando Excepciones en Python
Para interceptar una excepción, coloca el código potencialmente inseguro dentro de un bloque try. La cláusula except contiene la lógica que se ejecuta cuando ocurre una excepción.
Ejemplo conciso que demuestra el flujo:
# Importar sys para inspeccionar el tipo de excepción
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("La entrada es", entry)
r = 1 / int(entry)
break
except:
print("¡Uy!", sys.exc_info()[0], "ocurrió.")
print("Siguiente entrada.")
print()
print("El reciproco de", entry, "es", r)
Salida
La entrada es a ¡Uy! <class 'ValueError'> ocurrió. Siguiente entrada. La entrada es 0 ¡Uy! <class 'ZeroDivisionError'> ocurrió. Siguiente entrada. La entrada es 2 El reciproco de 2 es 0.5
El código itera sobre random_list. Si la conversión a int o la división falla, el bloque except maneja el error, lo registra y pasa al siguiente elemento. Cuando ocurre una conversión exitosa, el bucle se rompe e imprime el reciproco.
Como todas las excepciones integradas heredan de Exception, puedes capturarlas genéricamente:
# Importar sys para inspeccionar el tipo de excepción
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("La entrada es", entry)
r = 1 / int(entry)
break
except Exception as e:
print("¡Uy!", e.__class__, "ocurrió.")
print("Siguiente entrada.")
print()
print("El reciproco de", entry, "es", r)
La salida es idéntica, pero el manejador ahora referencia la clase de excepción específica vía e.__class__.
Capturando Excepciones Específicas en Python
Capturar todas las excepciones ampliamente puede enmascarar bugs y dificultar la depuración. En su lugar, lista solo los tipos de excepción que esperas.
Un bloque try puede contener múltiples cláusulas except; solo se ejecuta la primera que coincida. Ejemplo:
try:
# código que puede lanzar error
pass
except ValueError:
# manejar ValueError
pass
except (TypeError, ZeroDivisionError):
# manejar TypeError o ZeroDivisionError
pass
except Exception:
# fallback para cualquier otra excepción
pass
Lanzando Excepciones en Python
Más allá de excepciones automáticas, los desarrolladores pueden lanzar errores explícitamente usando la sentencia raise. Opcionalmente, pasa un mensaje para clarificar la razón.
raise KeyboardInterrupt # Traceback: KeyboardInterrupt
raise MemoryError("Este es un argumento") # Traceback: MemoryError: Este es un argumento
try:
a = int(input("Ingresa un entero positivo: "))
if a <= 0:
raise ValueError("¡Eso no es un número positivo!")
except ValueError as ve:
print(ve)
Cláusula else en try de Python
La cláusula opcional else se ejecuta solo cuando el bloque try completa sin lanzar excepción. Este patrón mantiene el código de camino exitoso separado del manejo de errores.
Ejemplo: imprimir el reciproco de un número par.
# programa para imprimir el reciproco de números pares
try:
num = int(input("Ingresa un número: "))
assert num % 2 == 0
except:
print("¡No es un número par!")
else:
reciproco = 1 / num
print(reciproco)
Salida al ingresar un número impar:
Ingresa un número: 1 ¡No es un número par!
Salida al ingresar un número par:
Ingresa un número: 4 0.25
Ten en cuenta que si num es cero, ZeroDivisionError se lanza en el bloque else y no es capturado por la cláusula except precedente.
try…finally en Python
La cláusula finally garantiza que el código de limpieza se ejecute independientemente de si ocurrió una excepción. Es esencial al trabajar con recursos externos como archivos, conexiones de red o GUIs.
Uso típico con manejo de archivos:
try:
f = open("test.txt", encoding='utf-8')
# realizar operaciones de archivo
finally:
f.close()
El archivo siempre se cierra, incluso si surge un error durante el procesamiento.
python
- Construya un sensor de temperatura remoto con Raspberry Pi y Python – Guía paso a paso
- Manejo de excepciones en C++: Guía práctica con try, catch, throw
- Palabras clave e identificadores en Python: Dominando palabras reservadas y convenciones de nomenclatura
- Sentencias, indentación y comentarios en Python: Guía clara
- Variables, constantes y literales en Python – Guía completa
- Dominando conversión y casting de tipos en Python: Guía completa
- Dominando E/S e importación de módulos en Python: Guía práctica
- Dominando la sentencia pass en Python: Guía práctica
- Entendiendo variables globales, locales y nonlocal en Python
- Dominando Operaciones de Directorios y Archivos en Python
- Dominando el Manejo de Excepciones en Python: try, except, else y finally Explicados