Manejo de errores: else
Recordamos nuestro último programa:
python | |
---|---|
Ingrese un número entero: hola
¡Ups! El valor ingresado no es un número entero.
Traceback (most recent call last):
File "c:\Usuarios\pablo\runtimeError.py", line 7, in <module>
print(f"El número ingresado es: {numero}")
^^^^^^
NameError: name 'numero' is not defined
Aquí dimos con un error que creímos tenía que ver con el alcance de las variables en Python. Creímos que la variable numero
en la línea 7 estaría siendo llamada afuera del bloque donde fuera creada, en la línea 2, adentro del bloque try
. Pero no es así. Aquí ocurre otra cosa, algo más sutil. ¿Pudiste deducir que es?
Lo que ocurre aquí se reduce al orden de ejecución de las operaciones en la línea 2:
- El programa solicita al usuario un número entero.
- El usuario ingresa un valor no numérico.
- Al presionar ENTER,
input()
devuelve una cadena de caracteres. - La función
int()
intenta convertir la cadena de caracteres en un número entero. - La conversión falla y se genera un error de valor.
- Al fallar la conversión de la cadena de caracteres a un número entero, el programa salta al bloque
except
en la línea 5, terminando de manera abrupta la ejecución de la línea 2 y dejando sin efecto la operación de asignación de la (no) conversión a entero a la variablenumero
. - Al no producirse la asignación de un valor a la variable
numero
, dicha variable nunca llega a existir en el programa. - Luego, al intentar imprimir la variable
numero
en la línea 7, Python no la encuentra y genera un error de nombre.
¡Esto es lo que ocurre realmente en el programa!
¿Y cómo hacemos para resolver un problema como este?
try… except… else…
Python posee otra característica de la sintaxis try… except…
que es que también admite otro bloque denominado else
. Aquí, la palabra clave else
funciona de manera similar a como lo hace en una estructura alternativa de control de flujo: como opción por descarte cuando ninguna otra opción es validada para su ejecución.
El bloque else
Para entender mejor el funcionamiento del bloque else
en una estructura try… except… else…
, refactoricemos nuestro programa anterior para incluirlo:
Analicemos el programa:
- El intérprete ejecuta la línea 2, entendiendo que en el siguiente bloque de código podría sucederse algún tipo de error.
- El intérprete intenta ejecutar la línea 3, solicitando al usuario un número entero, pero como este será devuelto como cadena de caracteres, a continuación intentará convertirlo a un número entero para asignarlo a la variable
numero
. - Si algo sale mal durante la ejecución de la línea 3, el intérprete ejecutará las líneas 6 y 7 para informar acerca del error de valor, salteándose las ejecuciones de las líneas 10 y 11.
- Pero si la conversión de la cadena de caracteres a un número entero es exitosa y el valor es almacenado en la variable
numero
, no habrá ninguna excepción que manejar y el intérprete ejecutará las líneas 10 y 11, directamente, para imprimir el número ingresado sin ejecutar las líneas 6 y 7 previamente.
Si ejecutamos el código con un valor numérico, el programa funcionará correctamente:
Pero si lo ejecutamos con un valor no numérico, el programa manejará el error de valor y no intentará imprimir el número ingresado:
Ingrese un número entero: hola
¡Ups! El valor ingresado no es un número entero.
¡Y listo! ¡Problema resuelto! ¡Ahora nuestro programa funciona correctamente! ¡Y todo gracias al bloque else
!
¡Para recordar!
El bloque else
en una estructura try… except… else…
se ejecuta solo si no se produce ninguna excepción en el bloque try
. Es una excelente manera de manejar errores y excepciones en Python.
Sin embargo, a pesar de que nuestro código se vuelve cada vez mas robusto, aún hay un problema que no hemos resuelto. ¿Puedes adivinar cuál es?
Te doy una pista: el usuario se equivoca en el ingreso. Y ya vimos que sucede y también vimos como evitar que el programa no se ejecute.
Pero, ¿nos quedamos contentos con esto? Porque el programa, al fin y al cabo tiene un propósito, y es mostrar el número ingresado por el usuario. ¿Cómo podríamos hacer para que el programa finalice su ejecución de manera exitosa, a pesar de que el usuario se equivoque en el ingreso del número?
Piensa tu respuesta y luego avancemos al siguiente tema.