Contenidos
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
-
Norma
-
Si una excepción se puede manejar no debe propagarse
-
Es más cómodo usar métodos que no produzcan errores
-
-
Norma
-
No utilizar las excepciones para evitar una consulta
-
No abusar de ellas
-
-
-
Norma
-
Separar el tratamiento de errores de la lógica
Todo junto Separado
-
-
Norma
-
No ignorar una excepción ya que dejamos el código con errores sin controlar
-