Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Siempre existirn situaciones que estarn fuera de nuestro control, como que falle la red, que desaparezca un archivo y otros casos. Los programadores deben aprender a lidiar con estas situaciones embarazosas y frustrantes y hacer que sus programas se recuperen con gracia, elegantemente. El mejor software mantiene informado al usuario sobre las cosas malas que ocurren y que debe hacerse para recuperarse. Aprendiendo a utilizar excepciones y proporcionado mensajes apropiados con los medios adecuados, podemos poner nuestro software en un nivel adecuado de confiabilidad y calidad. Ante una situacin excepcional (no puede ejecutar la instruccin), Python responde con un largo y feo mensaje de error y aborta el programa. El mensaje de error, denominado rastreo (traceback), es la forma en que Python nos proporciona informacin de que algo inesperado ha ocurrido durante la ejecucin. En Python, los errores de tiempo de ejecucin son llamados excepciones. El rastreo contiene informacin relativa al nmero de lnea (o nmeros de lneas) donde se origina la excepcin. La ltima lnea del mensaje de error muestra el nombre de la excepcin generada (ZeroDivisionError) y una breve descripcin del error que la origin: divisin entera o mdulo por cero.
Los datos ingresan, son manipulados y luego son guardados, mostrados, impresos o transferidos. Durante el proceso de ingreso de datos uno debe considerar lo que puede salir mal cuando se interacta con datos externos a los programas y hay muchas cosas esperando ponernos en evidencia! Pueden ocurrir circunstancias que impidan la captura de datos con xito, algunos de estos errores son realmente fatales y ocasionan que el programa se aborte y deje de funcionar. Algunos otros no son tan graves y pueden pasar en silencio, y el programa continuar corriendo, pero esto es igualmente malo pues los resultados no sern fidedignos. Consideremos, por ejemplo, el programa del Listado 1. Este programa obtiene del usuario dos nmeros y luego divide el primero por el segundo. En la corrida ejemplo, sin embargo, ocurri una situacin excepcional por que el usuario introdujo 0 como el segundo nmero. (La divisin por cero es matemticamente imposible).
Pgina 1 de 4
Al ejecutar el cdigo problemtico y producirse el error, en lugar de ejecutar el resto del cdigo que sigue, Python abandona la nave y salta completamente este cdigo. Esto es lo que se conoce como lanzar una excepcin: el programa no se quiebra, si no que abandona lo que estaba tratando de hacer e intenta recuperarse de la situacin, para lo cual necesita recomenzar la ejecucin de cdigo desde algn lugar.
Python salta el cdigo problemtico (el fragmento despus de try, el cdigo a proteger) y nosotros podemos escribir un fragmento de cdigo que se ejecute cuando se genere la excepcin, que lo escribimos despus de una etiqueta except. Esto se denomina capturar la excepcin. El fragmento de cdigo que se ejecuta cuando se lanza una excepcin es llamado un manejador de excepcin.
Listado 3. (mostrar_contenido1.py)
#! /usr/bin/python # Este programa muestra el contenido # de un archivo. def principal( ) : # Obtener el nombre del archivo. nombre_archivo = input('Escriba el nombre del archivo: ' ) entrada = open(nombre_archivo, 'r') contenido = entrada.read() print (contenido) entrada.close() # Llamar a la funcin principal principal() print ('Continuacion del programa')
El programa del Listado 4 muestra cmo podemos escribir una instruccin try-except para responder agradablemente a una excepcin IOError.
Pgina 2 de 4
IOError. Cuando esto ocurre, el programa se sale del bloque try saltandose las lneas 12 a 14. Como la clusula except en la lnea 15 especifica la excepcin FileNotFoundError, el programa salta al manejador que comienza en la lnea 17 y se muestra el mensaje indicador de que ha ocurrido un error y no el feo mensaje del rastreo.
La excepcin ha sido capturada, el error es un error es de entradasalida (no existe el archivo) y podemos escribir nuestro manejador de excepcin, quedando nuestro cdigo as:
Listado 5. (mostrar_contenido3.py)
#! /usr/bin/python # Este programa muestra el contenido # de un archivo. def principal( ) : # Obtener el nombre del archivo. nombre_archivo = input('Escriba el nombre del archivo: ' ) try: entrada = open(nombre_archivo, 'r') contenido = entrada.read() print (contenido) entrada.close() except FileNotFoundError as e : # Manejador de la excepcin print print ('Ocurri un error tratando de leer') print ("el archivo '%s' " % nombre_archivo) print (e) # Llamar a la funcin principal principal() print print ('Aqu contina el programa.') print ('Despus de manejar la excepcin') print ('recupera su flujo normal.')
Listado 6. (reporte_ventas.py)
#! /usr/bin/python # Este programa muestra el total de los # montos en el archivo datos-ventas.dat. def principal(): # Inicializar un acumulador. total = 0.0 try: # Abrir el archivo datos-ventas.dat. entrada = open('empleados.dat', 'r') # Leer los valores del archivo y # acumularlos. for linea in entrada: monto = float (linea) total += monto # Cerrar el archivo. entrada.close() # Imprimir el total. print ('Total: $%.2f' % total) except FileNotFoundError: print ('Ocurri un error tratando de leer el archivo.') except ValueError: print ('Datos no numricos encontrados. ') except: print ('Ocurri un error desconocido. ') # Llamar a la funcin principal principal()
El bloque try contiene cdigo que puede generar diferentes tipos de excepciones. Por ejemplo:
Qu ocurri?
Cuando la lnea 8 se ejecut, el usuario introdujo inexistente.txt, lo cual fue asignado a la variable nombre_archivo. Dentro del bloque try la lnea 11 intenta abrir el archivo inexistente.txt y, dado que este archivo no existe, la instruccin genera una excepcin
La instruccin en la lnea 13 puede generar una excepcin FileNotFoundError si el archivo datos-ventas.dat no existe.
Pgina 3 de 4
El bucle for en la lnea 17 tambin puede generar una excepcin si encuentra un problema leyendo los datos del archivo. La funcin float en la lnea 18 puede generar una excepcin ValueError si la variable lnea referencia una cadena que no puede ser convertida a un nmero punto flotante (una cadena alfabtica, por ejemplo).
La clusula except en la lnea 27 especifica la excepcin FileNotFoundError. Su manejador en la lnea 28 se ejecuta si se genera una excepcin FileNotFoundError. La clusula except en la lnea 30 especifica la excepcin Value Error. Su manejador en la lnea 31 se ejecutar si una excepcin ValueError es generada. La clusula except en la lnea 33 no especifica ninguna excepcin. Su manejador se ejecutar si es lanzada una excepcin que no es manejada por alguna otra clusula except.
Hemos visto ejemplos de programas que pueden generar excepciones ZeroDivisionError, IOError, y ValueError. Existen muchos tipos diferentes de excepciones que pueden ocurrir en un programa Python. Cuando nos encontremos diseando instrucciones try except, una forma de aprender las excepciones que se necesita manejar es consultar la documentacin de Python. Esta proporciona informacin detallada acerca de toda excepcin posible, y los tipos de errores que pueden ocasionar que ellas ocurran. Otra manera en que se puede aprender acerca de las excepciones que pueden ocurrir en un programa es mediante la experimentacin. Uno puede correr el programa y deliberadamente realizar acciones que causen errores. Observando el mensaje de error del rastreo que se muestra, uno ve los nombres de las excepciones que se generan. Entonces se puede escribir clusulas except para manejar esas excepciones.
Pgina 4 de 4