jueves, 18 de agosto de 2016

Progamación Python XIII (control excepciones)

Este es otro post dedicado a programación en Python, encontraréis todos los posts de este tipo juntos en el apartado Programación del blog. Y si queréis aprender más podéis visitar la web oficial de www.python.org

En este post vamos a ver como controlar las excepciones con python. Seguramente si habéis seguido los anteriores post de python en algún momento al ejecutar el código python os ha devuelto un error o excepción, y el código no se ha ejecutado de forma correcta, bien porque hemos cometido un error al escribir o bien porque hemos provocado un error involuntario. El mensaje de error que devuelve python muchas veces no queremos mostrarlo tal cual al usuario, de manera que tendremos que controlar el error y devolver un mensaje concreto.




1. Control de excepciones con try ... except



1.1 Generar un error en python

Para poder ver como funciona el control de errores y/o excepciones lo primero que vamos a hacer es crear un código que genere un error, por ejemplo vamos a definir una lista de 9 elementos y vamos a intentar acceder al elemento núemero 10 (que no existe), lo que provocará un error de ejecución del programa. Seguid el ejemplo

# guardamos en una variable una lista de elementos
lista_numeros=[0,1,2,3,4,5,6,7,8]
# mostramos por pantalla el elemento 2 de la lista
print(lista_numeros[2])
# mostramos por pantalla el elemento 10 de la lista que no existe
print(lista_numeros[10])
# mostramos por pantalla el elemento 6 de la lista
print(lista_numeros[6])

al ejecutar este código en la consola de python veremos por pantalla el elemento 2 de la lista y luego obtendremos un error IndexError, parecido a este

Traceback (most recent call last):
    File "<stdin>" , line 6, in <module>
    print(lista_numeros[10])
IndexError: list index out of range



1.2 Estructura para controlar errores


Si queremos controlar un error tendremos que usar la estructura try ...except, que se usa de la siguiente forma

# guardamos en una variable una lista de elementos
lista_numeros=[0,1,2,3,4,5,6,7,8]
# iniciamos el código con control de errores con try
try:
    # mostramos por pantalla el elemento 2 de la lista
    print(lista_numeros[2])
    # mostramos por pantalla el elemento 10 de la lista que no existe
    print(lista_numeros[10])
    # mostramos por pantalla el elemento 6 de la lista
    print(lista_numeros[6])
# iniciamos bloque except
except:
    # codigo que se ejecutara si se produce una excepcion
    print("Se ha producido un error")

en este ejemplo hemos definido un lista con 9 elementos, seguidamente encontramos try, todo el código que se encuentra en la sección try es el que se ejecuta primero, si durante la ejecución de este código se produce una excepción se ejecutará el código que se encuentra en la sección except.
Esta estructura nos sirve para capturar prácticamente cualquier error.


1.2 Estructura para controlar un error determinado



Es posible que no siempre queramos capturar el error de forma genérica  y queramos determinar un mensaje de error concreto según el error que devuelve python. Con python también podemos afinar más esta captura de errores definiendo el tipo de error que queremos capturar, mirad el siguiente ejemplo

# guardamos en una variable una lista de elementos
lista_numeros=[0,1,2,3,4,5,6,7,8]
# iniciamos el código con control de errores con try
try:
    # mostramos por pantalla el elemento 2 de la lista
    print(lista_numeros[2])
    # mostramos por pantalla el elemento 10 de la lista que no existe
    print(lista_numeros[10])
    # mostramos por pantalla el elemento 6 de la lista
    print(lista_numeros[6])
# iniciamos bloque except
except IndexError:
    # codigo que se ejecuta si se produce un error IndexError
    print("Se ha producido un error, IndexError")
except IOError:
    # codigo que se ejecuta si se produce un error IOErrors
    print("Se ha producido un error, IOError")
except:
   # codigo que se ejecuta si se produce un error distinto de IndexError o IOError
    print("Se ha producido un error")

en este ejemplo hemos definido una lista de 9 elementos, seguidamente encontramos try, con el código que se ejecutará, y luego una sección except IndexError, el código que se encuentra aquí sólo se ejecutará si se produce un error IndexError, luego tenemos otro bloque con except IOError, que sólo se ejecutaría en el caso que se detectara un error de tipo IOError, y finalmente también hemos añadido un bloque except que se ejecutará siempre que se produzca un error y no sea de tipo IndexError o IOError, o sea para el resto de excepciones. Con este código podemos determinar de forma más precisa el tipo de error que se produce y ejecutar un código concreto para evitar que el programa deje de funcionar o lance un error inesperado al usuario.


1.3 Excepciones con bloque else



También podemos añadir en el código de excepciones un bloque else, que se ejecutará en el caso que no se produzca un error, mirad este ejemplo

# guardamos en una variable una lista de elementos
lista_numeros=[0,1,2,3,4,5,6,7,8]
# iniciamos el código con control de errores con try
try:
    # mostramos por pantalla el elemento 2 de la lista
    print(lista_numeros[2])
    # mostramos por pantalla el elemento 6 de la lista
    print(lista_numeros[6])
# iniciamos bloque except
except IndexError:
    # codigo que se ejecuta si se produce un error IndexError
    print("Se ha producido un error, IndexError")
# iniciamos bloque else
else:
    # codigo que se ejecuta si no se produce un error
    print("Índice correcto")

en este ejemplo hemos definido una lista de 9 elementos, seguidamente encontramos el bloque try con el código a ejecutar, y luego la sección except IndexError, que se ejecuta si se produce un error de tipo IndexError, seguidamente hemos añadido un bloque else que se ejecutará siempre que no se produzca un error IndexError


1.4 Excepciones con el bloque finally



También podemos añadir en el código de excepciones un bloque finally, que se ejecutará siempre al final (una vez haya finalizado la ejecución de todo el código dentro del bloque try) se haya producido o no un error, como en el ejemplo siguiente

# guardamos en una variable una lista de elementos
lista_numeros=[0,1,2,3,4,5,6,7,8]
# iniciamos el código con control de errores con try
try:
    # mostramos por pantalla el elemento 2 de la lista
    print(lista_numeros[2])
    # mostramos por pantalla el elemento 10 de la lista que no existe
    print(lista_numeros[10])
    # mostramos por pantalla el elemento 6 de la lista
    print(lista_numeros[6])
# iniciamos bloque except
except IndexError:
    # codigo que se ejecuta si se produce un error IndexError
    print("Se ha producido un error, IndexError")
# iniciamos bloque else
else:
    # codigo que se ejecuta si no se produce un error
    print("Índice correcto")
# iniciamos bloque finally
finally:
    # codigo que se ejecuta siempre tras ejecutarse el codigo de try
    print("la instrucción try ha finalizado")


1.5 Mas información sobre los errores



Si tomamos el primer ejemplo de este post ya hemos visto que python nos devolvía un error, este era el código


# guardamos en una variable una lista de elementos
lista_numeros=[0,1,2,3,4,5,6,7,8]
# mostramos por pantalla el elemento 2 de la lista
print(lista_numeros[2])
# mostramos por pantalla el elemento 10 de la lista que no existe
print(lista_numeros[10])
# mostramos por pantalla el elemento 6 de la lista
print(lista_numeros[6])

y éste el error devuelto


Traceback (most recent call last):
    File "<stdin>" , line 6, in <module>
    print(lista_numeros[10])
IndexError: list index out of range

en algunos casos puede ser que el error devuelto sea poco claro o que no nos permita entender la razón por la que se ha producido, tenemos una herramienta pata obtener más información del error, esta herramienta es Exception, veamos un ejemplo

# guardamos en una variable una lista de elementos
lista_numeros=[0,1,2,3,4,5,6,7,8]
# iniciamos el código con control de errores con try
try:
    # mostramos por pantalla el elemento 2 de la lista
    print(lista_numeros[2])
    # mostramos por pantalla el elemento 10 de la lista que no existe
    print(lista_numeros[10])
    # mostramos por pantalla el elemento 6 de la lista
    print(lista_numeros[6])
# iniciamos bloque except
except Exception as e:
    # codigo que se ejecutara si se produce una excepcion
    print("Se ha producido un error")
    # codigo que muestra la descripcion del error
    print(e)

en este caso en el bloque except hemos usado el comando Exception as e, y al final del bloque hemos añadido la línia print(e), esto nos devolverá lo siguiente

Se ha producido un error
list index out of range

recibiremos una información más detallada del origen y la causa del error.

Para más información os dejo un link de referencia de la web oficial de python

https://docs.python.org/3.4/library/exceptions.html