python-try-except

Captuar excepciones con Try-Except en Python

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ón 10/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.