1

Empieza a manejar las excepciones 馃

Excepciones

Los errores de ejecuci贸n son llamados com煤nmente excepciones y por eso de ahora en m谩s utilizaremos ese nombre. Durante la ejecuci贸n de un programa, si dentro de una funci贸n surge una excepci贸n y la funci贸n no la maneja, la excepci贸n se propaga hacia la funci贸n que la invoc贸, si esta otra tampoco la maneja, la excepci贸n continua propag谩ndose hasta llegar a la funci贸n inicial del programa y si esta tampoco la maneja se interrumpe la ejecuci贸n del programa. Veamos entonces como manejar excepciones.

Para el manejo de excepciones los lenguajes proveen ciertas palabras reservadas, que nos permiten manejar las excepciones que puedan surgir y tomar acciones de recuperaci贸n para evitar la interrupci贸n del programa o, al menos, para realizar algunas acciones adicionales antes de interrumpir el programa.

En el caso de Python, el manejo de excepciones se hace mediante los bloques que utilizan las sentencias try, except y finally.

Dentro del bloque try se ubica todo el c贸digo que pueda llegar a levantar una excepci贸n , se utiliza el t茅rmino levantar para referirse a la acci贸n de generar una excepci贸n.

A continuaci贸n se ubica el bloque except, que se encarga de capturar la excepci贸n y nos da la oportunidad de procesarla mostrando por ejemplo un mensaje adecuado al usuario . Veamos qu茅 sucede si se quiere realizar una divisi贸n por cero:

>>> dividendo = 5>>> divisor = 0>>> dividendo / divisor
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>ZeroDivisionError: integer division or modulo by zero

En este caso, se levant贸 la excepci贸n ZeroDivisionError cuando se quiso hacer la divisi贸n. Para evitar que se levante la excepci贸n y se detenga la ejecuci贸n del programa, se utiliza el bloque try-except.

>>> try:
...     cociente = dividendo / divisor
... except:
... print"No se permite la divisi贸n por cero"

No se permite la divisi贸n por cero

Dado que dentro de un mismo bloque try pueden producirse excepciones de distinto tipo, es posible utilizar varios bloques except, cada uno para capturar un tipo distinto de excepci贸n.

Esto se hace especificando a continuaci贸n de la sentencia except el nombre de la excepci贸n que se pretende capturar. Un mismo bloque except puede atrapar varios tipos de excepciones, lo cual se hace especificando los nombres de la excepciones separados por comas a continuaci贸n de la palabra except. Es importante destacar que si bien luego de un bloque try puede haber varios bloques except, se ejecutar谩, a lo sumo, uno de ellos.

try:
    # aqu铆 ponemos el c贸digo que puede lanzar excepciones
except IOError:
    # entrar谩 aqu铆 en caso quese haya producido
    # una excepci贸n IOError
except ZeroDivisionError:
    # entrar谩 aqu铆 en caso quese haya producido
    # una excepci贸n ZeroDivisionError
except:
    # entrar谩 aqu铆 en caso quese haya producido
    # una excepci贸nqueno corresponda a ninguno
    # de los tipos especificados en los except previos

Como se muestra en el ejemplo precedente tambi茅n es posible utilizar una sentencia except sin especificar el tipo de excepci贸n a capturar, en cuyo caso se captura cualquier excepci贸n, sin importar su tipo. Cabe destacar, tambi茅n, que en caso de utilizar una sentencia except sin especificar el tipo, la misma debe ser siempre la 煤ltima de las sentencias except, es decir que el siguiente fragmento de c贸digo es incorrecto

try:
    # aqu铆 ponemos el c贸digo que puede lanzar excepciones
except:
    # ERRORde sintaxis, esta sentencia no puede estar aqu铆,
    # sino que deber铆a estar luego del except IOError.
except IOError:
    # Manejo dela excepci贸nde entrada/salida

Finalmente, puede ubicarse un bloque finally donde se escriben las sentencias de finalizaci贸n, que son t铆picamente acciones de limpieza. La particularidad del bloque finally es que se ejecuta siempre, haya surgido una excepci贸n o no. Si hay un bloque except, no es necesario que est茅 presente el finally, y es posible tener un bloque try s贸lo con finally, sin except.

Veamos ahora como es que act煤a Python al encontrarse con estos bloques. Python comienza a ejecutar las instrucciones que se encuentran dentro de un bloque try normalmente. Si durante la ejecuci贸n de esas instrucciones se levanta una excepci贸n, Python interrumpe la ejecuci贸n en el punto exacto en que surgi贸 la excepci贸n y pasa a la ejecuci贸n del bloque except correspondiente.

Para ello, Python verifica uno a uno los bloques except y si encuentra alguno cuyo tipo haga referencia al tipo de excepci贸n levantada, comienza a ejecutarlo. Sino encuentra ning煤n bloque del tipo correspondiente pero hay un bloque except sin tipo, lo ejecuta. Al terminar de ejecutar el bloque correspondiente, se pasa a la ejecuci贸n del bloque finally, si se encuentra definido.

Si, por otra parte, no hay problemas durante la ejecuci贸n del bloque try, se completa la ejecuci贸n del bloque, y luego se pasa directamente a la ejecuci贸n del bloque finally (si es que est谩 definido).

Bajemos todo esto a un ejemplo concreto, supongamos que nuestro programa tiene que procesar cierta informaci贸n ingresada por el usuario y guardarla en un archivo. Dado que el acceso a archivos puede levantar excepciones, siempre deber铆amos colocar el c贸digo de manipulaci贸n de archivos dentro de un bloque try. Luego deber铆amos colocar un bloque except que atrape una excepci贸n del tipo IOError, que es el tipo de excepciones que lanzan la funciones de manipulaci贸n de archivos. Adicionalmente podr铆amos agregar un bloque except sin tipo por si surge alguna otra excepci贸n. Finalmente deber铆amos agregar un bloque finally para cerrar el archivo, haya surgido o no una excepci贸n.

try:
    archivo = open("miarchivo.txt")
    # procesar el archivoexcept IOError:
    print"Error de entrada/salida."# realizar procesamiento adicionalexcept:
    # procesar la excepci贸nfinally:
    # si el archivo no est谩 cerrado hay que cerrarloifnot(archivo.closed):
        archivo.close()

Algunas Excepciones Comunes

  • NameError: Esta excepci贸n es levantada cuando el programa no puede encontrar un nombre local o global. El nombre que podr铆a no ser encontrado est谩 incluido en el mensaje de error.

  • TypeError: Esta excepci贸n es levantada cuando una funci贸n se le pasa un objeto del tipo inapropiado como su argumento. M谩s detalles sobre el tipo incorrecto son proporcionados en el mensaje de error.

  • ValueError: Esta excepci贸n ocurre cuando un argumento de funci贸n tiene el tipo correcto pero un valor inapropiado.

  • NotImplementedError: Esta excepci贸n es levantada cuando se supone que un objeto apoye una operaci贸n pero no ha sido implementado a煤n. No deber铆as usar este error cuando la funci贸n dada no deba apoyar al tipo de argumento de entrada. En esas situaciones, levantar una excepci贸n TypeError es m谩s apropiado.

  • ZeroDivisionError: Esta excepci贸n es levantada cuando proporcionas el segundo argumento para una operaci贸n de divisi贸n o m贸dulo como cero.
    FileNotFoundError: Esta excepci贸n es levantada cuando el archivo o diccionario que el programa solicit贸 no existe.

Manejar excepciones apropiadamente puede ser muy 煤til en situaciones en donde no es viable salir de un programa despu茅s de que este reciba una entrada inesperada. Espero que les haya sido 煤til 馃槂

Escribe tu comentario
+ 2