En Python, cuando se produce un error, se genera una excepción. Las excepciones son objetos que simboliza el error y contiene información sobre el mismo.
Las excepciones son eventos que ocurren durante la ejecución de un programa y que alteran el flujo normal de instrucciones.
Esta excepción puede,
- Ser capturada por un bloque
try
- Si no, pasa a la función que invocó a la que genero el error.
Así la excepción va “subiendo”. Si nadie la gestiona, la excepción llegará a la función principal y lo normal es que el programa termine abruptamente.
El bloque Try-Except
Las Excepciones en Python se gestionan con un bloque Try-Except, que tiene la siguiente sintaxis básica,
try:
# Código que puede lanzar una excepción
except:
# Código a ejecutar si se produce una excepción
El bloque try
se utiliza para encapsular el código que puede generar una excepción. Dentro de este bloque se coloca el código que se desea ejecutar y que podría lanzar una excepción.
Si no se produce ninguna excepción, el flujo del programa continúa normalmente. Si se produce una excepción, el flujo del programa se desvía al bloque except
.
El bloque except
se utiliza para capturar y manejar las excepciones que se producen dentro del bloque try
. Dentro de este bloque se coloca el código que se desea ejecutar en caso de que se produzca una excepción.
try:
# Código que puede lanzar una excepción
resultado = 10 / 0
except:
# Código a ejecutar si se produce una excepción
print("Se produjo una excepción.")
En este caso,
- Dentro del bloque
try
tenemos la operación10/0
, que va a dar un error (porque no se puede dividir por cero). Así que saltará una excepción. - El bloque
except
capturará la excepción, y mostrará en pantalla el texto “Se produjo una excepnción.”
Captura de multiples Excepciones
Es posible capturar excepciones específicas utilizando la sintaxis except TipoDeExcepcion
o capturar cualquier tipo de excepción utilizando simplemente except:
.
try:
# Código que puede lanzar una excepción
resultado = 10 / 0
except ZeroDivisionError:
# Código a ejecutar si se produce una excepción del tipo ZeroDivisionError
print("No se puede dividir por cero.")
except ValueError:
# Código a ejecutar si se produce una excepción del tipo ValueError
print("Valor incorrecto.")
except:
# Código a ejecutar si se produce cualquier tipo de excepción
print("Se produjo una excepción.")
Bloque else
El bloque else
se utiliza para ejecutar código si no se produce ninguna excepción en el bloque try
.
try:
# Código que puede lanzar una excepción
resultado = 10 / 2
except ZeroDivisionError:
# Código a ejecutar si se produce una excepción del tipo ZeroDivisionError
print("No se puede dividir por cero.")
else:
# Código a ejecutar si no se produce ninguna excepción
print("La división fue exitosa. El resultado es:", resultado)
finally:
# Código a ejecutar siempre, independientemente de si se produce una excepción o no
print("Esta línea se ejecutará siempre.")
Bloque finally
El bloque finally
se utiliza para ejecutar código independientemente de si se produce una excepción o no.
try:
# Código que puede lanzar una excepción
resultado = 10 / 0
except ZeroDivisionError:
# Código a ejecutar si se produce una excepción del tipo ZeroDivisionError
print("No se puede dividir por cero.")
finally:
# Código a ejecutar siempre, independientemente de si se produce una excepción o no
print("Esta línea se ejecutará siempre.")
Dentro de este bloque se coloca el código que se desea ejecutar siempre, por ejemplo, para liberar recursos o realizar alguna limpieza.
Contexto del Manejador de Excepciones
Los bloques try
, except
, else
y finally
comparten contexto. Las variables que creamos en el bloque try
estarán disponibles en el resto. Por ejemplo,
try:
archivo = open('archivo.txt', 'r')
contenido = archivo.read()
except FileNotFoundError:
print("El archivo no se encontró.")
except IOError:
print("Error al leer el archivo.")
else:
print("El archivo se leyó correctamente. Contenido:")
print(contenido)
finally:
if 'archivo' in locals() and not archivo.closed:
archivo.close()
print("El archivo ha sido cerrado.")
En este caso archivo
y contenido
están disponibles los bloques else
y finally
, aunque hayan sido definidos en el bloque try
.