Saltar a contenido

Manejo de errores: else

Recordamos nuestro último programa:

python
1
2
3
4
5
6
7
try:
    numero = int(input("Ingrese un número entero: "))

except ValueError:
    print("¡Ups! El valor ingresado no es un número entero.")

print(f"El número ingresado es: {numero}")
Terminal (Entrada/Salida)
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:

  1. El programa solicita al usuario un número entero.
  2. El usuario ingresa un valor no numérico.
  3. Al presionar ENTER, input() devuelve una cadena de caracteres.
  4. La función int() intenta convertir la cadena de caracteres en un número entero.
  5. La conversión falla y se genera un error de valor.
  6. 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 variable numero.
  7. Al no producirse la asignación de un valor a la variable numero, dicha variable nunca llega a existir en el programa.
  8. 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:

python
# Solicita al usuario un número entero y luego intenta convertirlo a un número entero
try:
    numero = int(input("Ingrese un número entero: "))

# Maneja el error y emite un mensaje al usuario si el valor ingresado no puede ser convertido
except ValueError:
    print("¡Ups! El valor ingresado no es un número entero.")

# Solo si no se produce ningún error, imprime el número ingresado
else:
    print(f"El número ingresado es: {numero}")

Analicemos el programa:

  1. 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.
  2. 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.
  3. 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.
  4. 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:

Terminal (Entrada/Salida)
Ingrese un número entero: 10
El número ingresado es: 10

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:

Terminal (Entrada/Salida)
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.