Leer errores y validar las entradas

Ciencia y tecnologíaLeer errores y validar las entradas

Los errores forman parte del trabajo de programación. La diferencia está en cómo los investigas y cómo responde tu aplicación a datos que no puede utilizar. En esta lección aprenderás a leer una excepción, formular una hipótesis y recuperar una entrada incorrecta. No se trata de esconder cualquier fallo sino de tratar aquellos que puedes reconocer de manera razonable.

Tres problemas diferentes

Un error de sintaxis impide interpretar correctamente el código. Un error durante la ejecución aparece cuando una instrucción intenta realizar una operación que falla, como convertir una palabra con int. Un error lógico produce un resultado equivocado aunque Python no muestre ninguna excepción. Cada categoría requiere una comprobación distinta.

Si el programa calcula cuatro cajas cuando necesita cinco probablemente debes revisar la regla de redondeo, no reinstalar Python. Si aparece NameError quizá has escrito un nombre distinto del que definiste. Si recibes FileNotFoundError más adelante tendrás que revisar una ruta. El nombre de la excepción orienta la investigación pero no sustituye la lectura del contexto.

Leer el mensaje desde el final

Una traza de error suele mostrar varias líneas. La última identifica el tipo de excepción y una explicación. Las anteriores indican archivos, funciones y líneas implicadas. Empieza por el final para saber qué ha ocurrido y vuelve después a la línea de tu código que aparece señalada.

Copia el mensaje completo en tus notas cuando vayas a pedir ayuda. Decir «no funciona» obliga a adivinar. Es mucho más útil indicar qué entrada utilizaste, qué esperabas, qué apareció y qué línea estabas ejecutando. Si compartes una captura o un fragmento revisa que no incluya datos personales, claves o rutas que no quieras difundir.

Aísla el caso más pequeño que reproduzca el problema. Si int(«cinco») falla no necesitas enviar una aplicación entera para explicar la conversión. Reducir un ejemplo elimina distracciones y permite comprobar hipótesis con rapidez. Conserva aparte la versión original para no perder trabajo durante la investigación.

Capturar un fallo esperado

try permite ejecutar una operación que puede producir una excepción. except describe cómo responder a un tipo concreto. Para convertir una entrada a entero esperamos ValueError cuando el texto no tenga un formato válido. No necesitamos capturar indiscriminadamente cualquier excepción del sistema.

texto = input("Número de unidades: ")
try:
    unidades = int(texto)
except ValueError:
    print("Escribe un número entero, por ejemplo 4")
else:
    print(f"Has indicado {unidades} unidades")

El bloque else se ejecuta si el bloque try termina sin esa excepción. Mantener el try pequeño ayuda a saber qué operación estás protegiendo. Si metes todo el programa dentro puedes terminar atribuyendo al usuario un fallo que procede de otra parte de tu código.

Capturar una excepción no garantiza que el dato tenga sentido. int(«-3») produce un entero válido pero una cantidad negativa puede ser inaceptable. La conversión comprueba el formato numérico. Una condición posterior comprueba la regla del dominio. Son dos validaciones distintas y ambas pueden ser necesarias.

Volver a pedir el dato

Combina una función, un bucle y un tratamiento concreto de errores para solicitar un entero no negativo. Aquí while True representa una repetición que termina mediante return cuando encontramos un dato válido. continue salta directamente a la siguiente vuelta del bucle.

def pedir_entero_no_negativo(mensaje):
    while True:
        texto = input(mensaje).strip()
        try:
            numero = int(texto)
        except ValueError:
            print("Escribe un entero sin decimales")
            continue
        if numero < 0:
            print("El número no puede ser negativo")
            continue
        return numero

cantidad = pedir_entero_no_negativo("Unidades: ")
print(f"Cantidad aceptada: {cantidad}")

Prueba una palabra, un negativo y finalmente cuatro. La función debe responder a los dos primeros casos y devolver cuatro en el tercero. El programa no se reinicia: permanece en la petición hasta recibir un valor aceptable. El mensaje explica en cada caso qué debe cambiar la persona.

No utilices eval para convertir entradas del usuario en cálculos. Ejecutaría expresiones de Python en lugar de limitarse a interpretar una cantidad. int es suficiente para el objetivo de esta función. Elegir la herramienta más limitada que resuelve la tarea simplifica el comportamiento y evita introducir capacidades innecesarias.

Investigar sin cambiarlo todo

Cuando aparece un resultado inesperado escribe una hipótesis concreta. Por ejemplo: «el total se reinicia dentro del bucle». Añade temporalmente un print antes y después de la operación sospechosa. Observa los valores y modifica una sola cosa. Después repite el caso que fallaba y otro que ya funcionaba.

No dejes mensajes de diagnóstico mezclados con la salida final de la aplicación. Pueden confundir al usuario y dificultar que se detecten avisos importantes. Una vez localizada la causa elimina los prints temporales o sepáralos mediante un mecanismo de diagnóstico que entiendas. Para este curso basta con retirarlos tras la comprobación.

Errores habituales

  • Escribir un except sin tipo que oculte fallos inesperados.
  • Mostrar «todo correcto» después de una operación que ha fallado.
  • Confundir conversión válida con valor permitido.
  • Cambiar varias partes del programa antes de comprobar una hipótesis.
  • Utilizar eval para interpretar una cantidad introducida por teclado.

Lo que deberías recordar

  • El tipo de excepción y la línea señalada aportan pistas concretas.
  • Captura solo los fallos que sabes tratar de forma útil.
  • Formato y reglas del dato requieren comprobaciones diferentes.
  • Una corrección debe verificarse repitiendo el caso que fallaba.

Ejercicio práctico

Recupera el programa de paquetes de la lección cinco y sustituye su conversión directa por pedir_entero_no_negativo. En la duodécima hoja registra las entradas cinco, -2, 2.5, una cadena vacía y 4. Las cuatro primeras deben rechazarse y la última debe producir doce sobres.

Provoca después un NameError en una copia del archivo cambiando un nombre. Anota el mensaje y la línea. Corrígelo sin envolverlo en un except general. La práctica distingue dos acciones: ayudar al usuario ante una entrada previsible y reparar un fallo del código que no debería ocultarse.

Siguiente capítulo: Comprobar tu código con pruebas.

Volver al índice del curso de programación desde cero.

Últimos posts

Artículos más vistos

Horóscopo diario
Menú diario