Condicionales en Python
8. Try Except Else (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 try, except.
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.
- 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.
- 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.
- 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:
¿Qué hace exactamente el else
en un try/except/else
?
El bloque else
se ejecuta solo si no se lanzó ninguna excepción en el bloque try
. Esto permite separar el código que debería ejecutarse solo cuando todo en el try
fue exitoso, manteniendo el bloque try
lo más acotado posible al código que puede fallar.
Ventajas de enseñar y aplicar el else
:
-
Claridad del flujo de control.
-
Menor riesgo de ejecutar código cuando no debería.
-
Mejora las buenas prácticas de programación.
-
Ayuda al debugging ( detectar errores) se puede ver claramente qué parte puede lanzar error y qué no.
Analicemos este otro código muy básico:


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.
Analicemos otro código algo mas completo.
Notar que SOLO las líneas que pueden generar una excepción están en el try!!. Aquí claramente se puede ver que el else del try se lleva la mayoría de las líneas de código que NO generan excepción. Algo interesante de destacar que es que podríamos pensar que una división por cero como la que se planea en la línea 26 generaría una excepción, pero la lógica del código se pregunta primero si b!=0 , en ese caso excluye la posibilidad de excepción:-).
Veamos con un ejemplo.
Consigna 1: Sumar dos números ingresados por teclado
Consigna 2: Ingresar y mostrar un número entero.
Consigna 3 : Ingresar y 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.
La excepción de la línea 13 trata la excepción en con la excepción ZeroDivisionError de la línea 16 y 17.
Consigna 4. Vamos a presentar una variante de la consigna 3, donde prevenimos ñla excepción de dividir por cero con una lógica aquí USAMOS EL ELSE DEL TRY!.
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
- El if/elif/ese no tiene NADA que ver con try/except , no son ni hermanos ni primos!!
- try/except son para TRATAR ERRORES DE EXCEPCIÓN.
- if/elif/else son para EVALUAR CONDICIONES.
- Una condición es algo DISTINTO a una Excepción.
- Ambas estructuras producen un cambio en el flujo de ejecución de un programa, aunque por motivos muy diferentes y con finalidades totalmente distintas.