Está en la página 1de 4

Manejo de errores

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 son externos a nuestros programas.


La mayora de los programas se ajustan al modelo
entrada ----> proceso ----> salida,

Manejo de excepciones. Dos estrategias muy diferentes


Cuando se debe enfrentar situaciones de error, existen dos maneras diferentes de hacerlo: 1. 2. Una es aadir ms lgica al programa y si hay ms cosas de qu preocuparse, ms lgica se aade o Se puede dejar que ocurra el error, y luego manejar cada error si y cuando ste ocurre.

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).

1. Aadir lgica extra


Uno puede prevenir que se generen muchas excepciones codificando cuidadosamente el programa. Por ejemplo, el programa del Listado 2 muestra como la divisin por cero puede ser prevenida encerrando la instruccin problemtica (resultado = num1 / num2) en una simple instruccin if else; el programa prueba el valor de num2 y despliega un mensaje de error si el valor es 0 y el programa termina normalmente.

Listado 2. (division2.py) Listado 1. (divisin1.py)


#! /usr/bin/python #! /usr/bin/python def principal(): # Obtener los dos nmeros. num1 = int(input('Escriba un nmero: ')) num2 = int(input('Escriba otro nmero: ')) # Dividir numl por num2 y mostrar el resultado. resultado = num1 / num2 print (num1, 'dividido por', num2, 'es ', resultado) # Llamar a la funcin principal. principal() # Este programa divide un nmero por otro nmero. def principal(): # Obtener los dos nmeros. num1 = int(input('Escriba un nmero: ')) num2 = int(input('Escriba otro nmero: ')) # Si num2 no es 0, dividir numl por num2 # y mostrar el resultado. if num2 != 0: resultado = numl / num2 print (num1, 'dividido por', num2, 'es ', resultado) else: print ('No se puede dividir por cero. ') principal()

Corrida del programa.


Escriba un nmero: 10 Escriba otro nmero: 0 Traceback (most recent call last): File "/home/usuario/Programacion/division1.py", line 5, in <module> resultado = num1 / num2 ZeroDivisionError: integer division or modulo by zero

Pgina 1 de 4

Corrida del programa


Escriba un nmero: 10 Escriba otro nmero: 0 No se puede dividir por cero

try: entrada = open(nombre_archivo, 'r') contenido = entrada.read() print contenido entrada.close()

2. Manejar las excepciones.


Algunas situaciones excepcionales no pueden ser evitadas a pesar de lo cuidadoso que se escriba el programa. Una manera ms moderna y flexible de manejar potenciales errores en un programa es ejecutar las instrucciones, y si ocurre algo malo el programa puede detectarlo y saltar a otro conjunto de instrucciones que manejen la situacin errnea de una manera apropiada. Es claro que si uno decide ignorar una excepcin cuando ella sucede, nuestro programa se accidenta y se quema. Veamos, por ejemplo, el programa del Listado 3. Este programa obtiene del usuario el nombre de un archivo y luego despliega el contenido de ste. El programa funciona bien mientras el usuario introduzca el nombre de un archivo existente., si no, genera una excepcin Esto es lo que ocurre en la corrida del programa. (Note en el mensaje de error que el nombre de la excepcin ocurrida es IOError.)

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.

Capture la excepcin (except)


except Exception as e : # Captura de la excepcin print print e

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')

Atienda la excepcin con try except


Todo lo que se necesita es encerrar el fragmento de cdigo potencialmente problemtico y encerrarlo entre las etiquetas try y except el siguiente formato general muestra la variante ms simple:
try: cdigo del flujo normal ... except [NombreExcepcin as e]: cdigo de recuperacin de error ...

El programa del Listado 4 muestra cmo podemos escribir una instruccin try-except para responder agradablemente a una excepcin IOError.

Corrida del programa Listado 4. (mostrar_contenido2.py)


Escriba el nombre de un archivo: inexistente.txt Traceback (most recent call last): File "/home/usuario/Programacion/mostrar_archiv.py", line 6, in <module> entrada = open(nombre_archivo, 'r') IOError: [Error 2] No such file or directory: 'inexistente.txt' #! /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 Exception as e : # Captura de la excepcin print print (e)

Intntelo primero (try)


En lugar de aadir cdigo y lgica extra para defenderse de la situacin problemtica, el mecanismo de manejo de excepciones de Python permite que ocurra el error, lo pone de relieve y luego proporciona una oportunidad de recuperacin. A los fines de recuperarse de un error cuando este sucede, se requiere identificar el cdigo que pudiera generar una excepcin.

Pgina 2 de 4

# Llamar a la funcin principal principal() print ("Salida del programa")

Corrida del programa


Escriba el nombre del archivo: inexistente.txt [Errno 2] No such file or directory: 'inexistente.txt' Salida del programa

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.

Manejo de mltiples excepciones


En muchas ocasiones un bloque try puede ser capaz de emitir ms de un tipo de excepcin. En tal caso necesitamos escribir una clusula except por cada tipo de excepcin que se deba manejar. Por ejemplo, el programa del listado 6 nos presenta un programa que calcula el total de los montos de ventas contenidos en el archivo ventas.dat.

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()

Corrida del programa


Escriba el nombre del archivo: inexistente.txt Ocurri un error tratando de leer el archivo 'inexistente.txt' [Errno 2] No such file or directory: 'inexistente.txt' Aqu contina el programa. Despus de manejar la excepcin recupera su flujo normal.

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).

Observa que la instruccin try except tiene tres clusulas except:

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

También podría gustarte