8. Try Except (Excepciones)

8.3. Errores de Excepción

Cuando un programa se está ejecutando y se produce un error, puede suceder que el programa deje de ejecutarse, esto puede ser utilizado en algunas ocasiones como un ataque, se busca llegar a esta situación para justamente hacer que el programa pierda el control.

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

La declaración try funciona de la siguiente manera:
Primero, se ejecuta el bloque try (el código entre las declaración try y except), aquí se ubica todo el código que pueda llegar a crear una situación de excepción.

  1.     Si no ocurre ninguna excepción, el bloque except se saltea y termina la ejecución de la declaración try o salta al bloque else si existe.
  2.     Si ocurre una excepción durante la ejecución del bloque try, el resto del bloque se saltea. Luego, si su tipo coincide con la excepción nombrada luego de la palabra reservada except, se ejecuta el bloque except, y la ejecución continúa luego de la declaración try.
  3.     Si ocurre una excepción que no coincide con la excepción nombrada en el except, esta se pasa a declaraciones try de más afuera; si no se encuentra nada que la maneje, es una excepción no manejada, y la ejecución se frena con un mensaje como los mostrados arriba.

Podríamos resumir el flujo de ejecución de la siguiente forma:


Veamos este código:




Si se ingresa una letra, en este código, eso genera una excepción y el else (del try) NO SE EJECUTA!  (Línea 7), pero SIEMPRE se ejecuta la línea 11


Si se ingresa algo que NO genera excepción, se ejecuta el else ( del try)


Nota:

Ver que si no existe el else ( del try) y no se produce una excepción, el código que se ejecutaría luego del try sería lo que sigue al except, por lo tanto puede que en algunos casos el else no se lo va a ver en la sintaxis.

 Veamos con un ejemplo.

Consigna 1: Calcular el cociente de dos valores ingresados por teclado.

¿Qué sucede si el programa está esperando un número válido y esto no sucede?


Consigna 2:

Calcular el cociente de dos valores ingresados por teclado.

Vamos a resolver la consigna pensando en que el usuario del programa puede ingresar cualquier valor, letras, números, dividir por cero lo que sea y el programa debe poder resolver cualquier ingreso posible.


Podemos ver que la excepción de la línea 40 trata el tema de ingreso de letras, las líneas 36 y 37, tirarían una excepción del tipo ValueError, ya que no pueden convertir un string a un flotante. Con esto resolvemos el ingreso no debido de texto.

La excepción de la línea 42 trata la excepción que se podría generar en la línea 39 , el tercer argumento del format, si fuera el caso de que b=0 y se generara una excepción del tipo ZeroDivisionError.

Por el momento solo llegaremos hasta aquí con la excepciones, pero este tema es mas extenso.

Para el que esté interesado recurrir a:

  • https://docs.python.org/3/library/exceptions.html
  • https://docs.python.org/es/3/tutorial/errors.html

Aquí están algunas de las etiquetas de las excepciones predefinidas:

1) 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.
2) 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.
3) ValueError: Esta excepción ocurre cuando un argumento de función tiene el tipo correcto pero un valor inapropiado.
4) 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.
5) ZeroDivisionError: Esta excepción es levantada cuando proporcionas el segundo argumento para una operación de división o módulo como cero.
6) FileNotFoundError: Esta excepción es levantada cuando el archivo o diccionario que el programa solicitó no existe.

 ACLARACIONES

  1. El if/elif/ese no tiene NADA que ver con try/except , no son ni hermanos ni primos!!
  2. try/except son para TRATAR ERRORES DE EXCEPCIÓN.
  3. if/elif/else  son para EVALUAR CONDICIONES.
  4. Una condición es algo DISTINTO a una Excepción.
  5. Ambas estructuras producen un cambio en el flujo de ejecución de un programa, aunque por motivos muy diferentes y con finalidades totalmente distintas.