3.1 Captura de excepciones
No hablaríamos tanto sobre excepciones si solo tuviéramos que observarlas. Las excepciones son objetos especiales con los que puede trabajar tu programa en Python. El manejo de excepciones es un aspecto importante de la programación que permite mejorar la fiabilidad y resiliencia de los programas.
En Python, para la captura y manejo de excepciones se usan las estructuras try
, except
, else
y finally
. Estas estructuras permiten interceptar errores que ocurren durante la ejecución de un programa y tomar las acciones correspondientes.
Estructura try-except
La estructura try-except
se utiliza para capturar y manejar excepciones. El bloque try
contiene el código que podría provocar una excepción, y el bloque except
contiene el código que se ejecutará en caso de que ocurra una excepción.
Ejemplo:
try:
result = 10 / 0
except ZeroDivisionError:
print("Error: división por cero.")
Si en el código dentro del bloque try
ocurre una excepción ZeroDivisionError
, será capturada por el bloque except
y se ejecutará el código que llama a print()
.
Manejo de múltiples excepciones
Puedes manejar múltiples tipos de excepciones especificándolos en bloques except
separados.
try:
result = int("abc")
except ZeroDivisionError:
print("Error: división por cero.")
except ValueError:
print("Error: valor no válido.")
Captura de todas las excepciones
Si deseas capturar todas las excepciones, puedes usar un bloque except
sin especificar un tipo de excepción en particular. Sin embargo, esto no es recomendado, ya que puede dificultar la depuración y ocultar errores importantes.
try:
result = 10 / 0
except:
print("Ha ocurrido un error.")
3.2 Operadores else
y finally
Además de los operadores try
y except
, hay dos más opcionales: else
y finally
. Ahora te cuento un poco más sobre ellos.
Estructura try-except-else
El bloque else
se utiliza para ejecutar código si no se han producido excepciones en el bloque try
.
try:
result = 10 / 2
except ZeroDivisionError:
print("Error: división por cero.")
else:
print(f"Resultado: {result}")
Estructura try-except-finally
El bloque finally
contiene código que se ejecutará independientemente de si ocurrió o no una excepción. Esto es útil para liberar recursos o realizar operaciones de cierre.
try:
result = 10 / 0
except ZeroDivisionError:
print("Error: división por cero.")
finally:
print("Este bloque siempre se ejecuta.")
Ejemplo completo: try-except-else-finally
Ejemplo:
try:
result = 10 / 2
except ZeroDivisionError:
print("Error: división por cero.")
else:
print(f"Resultado: {result}")
finally:
print("Este bloque siempre se ejecuta.")
3.3 Ejemplo try-except-else-finally
Vamos a ver un ejemplo real grande. Por ejemplo, intentamos leer datos de un archivo en el disco, ¿qué puede ser más sencillo?
file = open("file.txt", "r")
content = file.read()
print(content)
¿Qué podría salir mal? Por ejemplo, todo:
- El archivo puede no existir. Podría haberse eliminado accidentalmente, no guardarse, o tu programa podría estar ejecutándose en otra computadora donde nunca existió.
- Error al leer el archivo. Tu programa no tiene acceso a él porque se encuentra en un directorio que requiere permisos de administrador.
- Otro programa está escribiendo en este archivo y no puede leerse; tiene acceso exclusivo al archivo.
¿No es suficiente? Entonces no olvides que independientemente del paso en el que ocurrió el error al trabajar con el archivo, siempre debes "cerrarlo" para que el sistema operativo libere los recursos asignados para trabajar con ese archivo.
Así que el código real se verá más o menos así:
try:
file = open("non_existent_file.txt", "r")
content = file.read()
except FileNotFoundError:
print("Error: archivo no encontrado.")
except IOError:
print("Error: error de entrada/salida.")
else:
print(content)
finally:
if 'file' in locals() and not file.closed:
file.close()
print("Archivo cerrado.")
Bienvenido al mundo real, donde necesitas escribir código no solo para el "escenario de trabajo", sino para todos los posibles escenarios que puedan fallar.
Vale, no quiero asustarte, es más fácil de lo que parece. Solo necesitas entender qué son las condiciones de borde (corner cases
) y añadir verificaciones de errores estándar a tiempo. El resto lo harán los frameworks modernos por ti.
GO TO FULL VERSION