Bienvenidos un día más al curso de Python, hoy vamos a continuar con la segunda parte de las excepciones, en el anterior capítulo os enseñé cómo se generan las excepciones y cómo se controlan. En este capítulo hablaremos de cómo se procesan y cómo se propagan por la aplicación. Así que pongámonos manos a la obra.
Hemos visto cómo atrapar excepciones, ahora vamos a ver qué hacemos con estas excepciones. Siempre podríamos ejecutar alguna lógica particular del caso como: cerrar un archivo, realizar un procesamiento alternativo al del bloque «try», etc. Pero aparte de esto tenemos algunas opciones genéricas que consisten en: dejar constancia de lo ocurrido en algún fichero de log, propagar la excepción, o incluso hacer ambas cosas.
Para dejar constancia de la excepción, se puede escribir en un archivo de «log» o simplemente mostrar un mensaje en pantalla. Generalmente cuando se deja constancia de una excepción se suele proporcionar alguna información del contexto en el que se produjo, por ejemplo: tipo de excepción ocurrida, momento en que ocurrió la excepción y cuáles fueron las llamadas previas a la excepción. El objetivo de esta información es facilitar la corrección del código para evitar que se siga produciendo.
Es posible, por otra parte, que interese propagar la excepción a la función que había invocado a la función actual. Para hacer esto Python nos brinda la instrucción «raise».
Si se invoca esta instrucción dentro de un bloque «except», sin pasarle parámetros, Python enviará la excepción atrapada por ese bloque a la función llamante.
También podría ocurrir que en lugar de propagar la excepción tal cual fue atrapada, quisiéramos lanzar una excepción distinta. Para realizar esto, utilizaremos también la sentencia «raise», pero indicándole el tipo de excepción que deseamos lanzar y pasando a la excepción los parámetros con información adicional que queramos brindar.
A continuación podéis ver un ejemplo:
def dividir(dividendo, divisor):
try:
resultado = dividendo / divisor
return resultado
except ZeroDivisionError:
raise ZeroDivisionError("El divisor no puede ser cero")
Acceso a información de contexto
Para acceder a la información de contexto estando dentro de un bloque «except» existen dos alternativas. Se puede utilizar la función «exc_info» del módulo «sys» o bien pasarle un parámetro a la sentencia «except» para que almacene la información de la excepción.
Si optamos por la primera opción, obtendremos una tupla con información sobre la última excepción atrapada en un bloque «except». Dicha tupla contiene tres elementos: el tipo de excepción, el valor de la excepción y las llamadas realizadas.
Pero si optamos por la segunda obtendremos la información en el parámetro proporcionado. Normalmente los programadores y la mayoría de los lenguajes de programación usan esta segunda opción. A continuación, podéis ver un ejemplo:
try:
# código que puede generar una excepción
except Exception, ex:
# procesamiento de la excepción cuya información
# es accesible a través del identificador ex
Esto es todo por hoy, os invito a que repaséis vuestras aplicaciones para ver si podéis realizar un mejor control de errores. Y para todos los que se acaban de incorporar indicarles que tenemos un índice con todos los capítulos del curso, ya que nunca es tarde para empezar.