Excepciones en Python

Excepciones en Python

Si una operación no puede completarse debido a un error, el programa deberá:

  • volver a un estado estable y permitir otras operaciones

  • intentar guardar el trabajo y finalizar

Esta tarea es difícil debido a que generalmente el código que detecta el error no es el que puede realizar dichas tareas por eso debe informar al que pueda manejarlo

La solución más habitual son los códigos de error

Python ofrece otra forma de tratar con los errores en condiciones excepcionales: las excepciones

Una condición excepcional es aquella que impide la continuación de una operación

No se sabe como manejarla, pero no se puede continuar

En Python se lanza una excepción para que alguien que sepa manejarla la trate en un contexto superior

En el ejemplo la función open comprueba si el fichero readme.txt existía en el sistema y en caso de no existir se lanza la excepción FileNotFoundError que de momento está sin tratar

Cuando el intérprete detecta el lanzamiento de la excepción finaliza el método actual y lanza un objeto que facilite información sobre el error ocurrido

Normalmente se gestionará cada tipo de error de forma individual

Manejo de la excepciones

Una vez detectado el error hace falta indicar quien se encarga de tratarlo

Un manejador de excepciones tiene el siguiente formato:

Bloque try

El bloque try delimita el grupo de operaciones que puede producir excepciones

Bloque except

El bloque except es el lugar al que se transfiere el control si alguna de las operaciones produce una excepción

En el ejemplo se ha usado un bloque try con su bloque except para gestionar los errores del ejemplo anterior

Si alguna de las operaciones del bloque produce una excepción, se interrumpe el bloque try y se ejecuta el except

Al finalizar este, se continua normalmente

Si no se produce ninguna excepción, el bloque except se ignora

Excepciones múltiples

También existe la posibilidad de utilizar un nombre de excepción para tratar errores específicos

Algunos de los cuales ya son reconocidos por el sistema, como la excepción FileNotFoundError, que se lanza cuando un archivo no existe en el sistema

En el ejemplo se ha usado un bloque try con varios bloques except para gestionar varias excepciones

Un bloque try puede tener varios except asociados

Le hemos añadimos la sentencia as al bloque except despues de nombrarlo para convertirlo en el objeto de excepción que hemos llamado e

Como puede verse, después de convertirlo en objeto, podemos utilizarlo como si fuera una clase

Cuando una excepción no se corresponde con ningún catch se propaga hacia atrás en la secuencia de invocaciones hasta encontrar un catch adecuado

En el ejemplo se gestionan las excepciones de los métodos f1 y f2 y si no encuentran ninguna continua la ejecución del código de forma normal fuera del bloque try

Se ha usado la sentencia raise seguida del nombre del tipo de excepción para propagarla y tratarla en otro lugar

En este caso la hemos tratado dentro de la propia función f1 en sus bloques excepción

Aunque al propagarla podría haberse tratado fuera de la misma en otro lugar del script

También se ha utilizado un bloque else que permite continuar la ejecución del código en caso de que no haya excepciones antes de continuar fuera del bloque try

Bloque else

Permite continuar la ejecución del código en caso de que no haya excepciones antes de continuar fuera del bloque try

El bloque else puede utilizarse para salir de un bucle si al final del mismo se añade la sentencia break

Es opcional y si no se usa, continuará la ejecución del código en el bloque finally y por último fuera del bloque try

Bloque finally

Puede haber ocasiones en que se desea realizar alguna operación tanto si se producen excepciones como si no

Dichas operaciones se pueden situar dentro de un bloque finally

Si no hay ninguna excepción se ejecutará el bloque try, después el bloque else y por último el finally

Al igual que el bloque else, es opcional y si no se usa, continuará la ejecución del código fuera del bloque try

Normas de uso

  1. Norma

    • Si una excepción se puede manejar no debe propagarse

    • Es más cómodo usar métodos que no produzcan errores

  2. Norma

    • No utilizar las excepciones para evitar una consulta

      • No abusar de ellas

  3. Norma

    • Separar el tratamiento de errores de la lógica

      Todo junto
      Separado
  4. Norma

    • No ignorar una excepción ya que dejamos el código con errores sin controlar