
Hasta ahora hemos aprendido a desarrollar programas utilizando variables, operadores, cadenas de texto, estructuras condicionales y bucles. Sin embargo, es muy habitual que un programa no funcione correctamente la primera vez que lo ejecutamos.
En programación, el proceso de localizar y corregir errores se conoce como depuración (debugging). Existen herramientas llamadas depuradores (debuggers) que permiten ejecutar un programa paso a paso y analizar su funcionamiento. Sin embargo, antes de aprender a utilizarlas es importante saber detectar errores de forma sencilla.
En este capítulo aprenderemos técnicas básicas de detección y corrección de errores en Python. Veremos cómo interpretar los mensajes de error, comprobar el valor de las variables y probar nuestros programas para localizar fallos y corregirlos de forma ordenada.
1. ¿Qué es depurar un programa?
Cuando escribimos un programa es normal que aparezcan errores. Incluso las personas con mucha experiencia los cometen continuamente.
Depurar (debug) significa localizar esos errores, comprender por qué se producen y corregirlos para que el programa funcione correctamente.
En este curso no utilizaremos un depurador, sino técnicas sencillas de detección y corrección de errores, como interpretar los mensajes que muestra Python, comprobar el contenido de las variables mediante print() y probar el programa con distintos datos para verificar que funciona correctamente.
Durante el desarrollo de un programa normalmente seguiremos este proceso:
- Escribimos el código.
- Ejecutamos el programa.
- Observamos el resultado.
- Si aparece un error o el resultado no es el esperado, buscamos la causa.
- Corregimos el programa y volvemos a ejecutarlo.
Este proceso se repite tantas veces como sea necesario hasta que el programa funciona correctamente.
Por ejemplo, imaginemos el siguiente programa:
edad = int(input("Edad: "))
if edad >= 18:
print("Mayor de edad")
else
print("Menor de edad")
Al ejecutarlo, Python mostrará un mensaje indicando que existe un error y el programa no podrá continuar.
Después de corregirlo:
edad = int(input("Edad: "))
if edad >= 18:
print("Mayor de edad")
else:
print("Menor de edad")
el programa funcionará correctamente.
También puede ocurrir que un programa se ejecute sin mostrar ningún error, pero obtenga un resultado incorrecto. En ese caso tendremos que revisar el código para descubrir qué está fallando.
¿Sabías que…? La palabra debug significa «eliminar errores». Aunque hoy se utiliza para referirse al proceso de corregir programas, su origen se hizo famoso cuando en 1947 se encontró una polilla (bug, en inglés) dentro de un ordenador, provocando un fallo en su funcionamiento.
2. Leer e interpretar los mensajes de error
Cuando Python encuentra un problema muestra un mensaje de error que nos ayuda a localizar la causa.
Al principio estos mensajes pueden parecer complicados, pero con un poco de práctica aprenderemos a interpretarlos.
Por ejemplo, si ejecutamos el siguiente programa:
print("Hola"
Python mostrará un mensaje parecido a este:
SyntaxError: '(' was never closed
En este caso nos indica que falta cerrar un paréntesis.
Otro ejemplo:
edad = int(input("Edad: "))
Si el usuario escribe:
hola
Python mostrará un mensaje similar a este:
ValueError: invalid literal for int()
El programa intenta convertir el texto "hola" en un número entero, pero no puede hacerlo.
En la mayoría de los casos basta con fijarse en dos partes del mensaje:
- La línea donde Python ha detectado el error.
- El tipo de error, que suele aparecer en la última línea.
Los tipos de error más habituales al comenzar a programar son:
| Tipo de error | ¿Qué significa? |
|---|---|
SyntaxError | El programa contiene un error de escritura y Python no puede interpretarlo. |
NameError | Se está utilizando una variable que no existe. |
ValueError | Se intenta convertir un dato a un tipo incompatible. |
TypeError | Se intenta realizar una operación con tipos de datos incompatibles. |
ZeroDivisionError | Se intenta dividir un número entre cero. |
Nota: No es necesario aprender de memoria los tipos de errores. Lo importante es acostumbrarse a leer los mensajes que muestra Python y utilizarlos para localizar y corregir el problema.
3. Utilizar print() para comprobar valores y detectar errores
En ocasiones el programa no muestra ningún mensaje de error, pero el resultado obtenido no es el esperado. En estos casos una técnica muy sencilla consiste en mostrar el contenido de las variables mientras el programa se está ejecutando.
Por ejemplo:
precio = 20 descuento = 5 total = precio - descuento print(total)
El programa funciona correctamente y muestra:
15
Sin embargo, cuando el programa es más largo puede resultar útil comprobar el valor de cada variable.
precio = 20
descuento = 5
print("Precio:", precio)
print("Descuento:", descuento)
total = precio - descuento
print("Total:", total)
Resultado:
Precio: 20 Descuento: 5 Total: 15
También podemos utilizar print() dentro de un bucle para comprobar cómo cambian las variables en cada repetición.
contador = 1
while contador <= 3:
print("Contador:", contador)
contador = contador + 1
Resultado:
Contador: 1 Contador: 2 Contador: 3
Mostrar el valor de las variables en distintos puntos del programa nos ayuda a comprobar si contienen la información esperada y facilita la localización de errores.
¿Sabías que…? Aunque los entornos de desarrollo incluyen depuradores muy completos, muchas personas desarrolladoras siguen utilizando
print()para comprobar rápidamente el valor de una variable mientras escriben un programa. Es una técnica sencilla, rápida y muy útil.
4. Probar un programa con distintos datos
Que un programa se ejecute sin mostrar errores no significa que funcione correctamente. Antes de dar un programa por terminado es recomendable probarlo con diferentes datos para comprobar que siempre produce el resultado esperado.
Observa el siguiente programa:
nota = int(input("Nota: "))
if nota > 5:
print("Aprobado")
else:
print("Suspenso")
A primera vista parece correcto.
Si lo probamos con una nota de 8, obtenemos:
Nota: 8 Aprobado
Y si lo probamos con una nota de 3:
Nota: 3 Suspenso
Parece que el programa funciona correctamente.
Sin embargo, ¿qué ocurre si introducimos una nota de 5?
Nota: 5 Suspenso
Ahora descubrimos un error lógico. En nuestro sistema de calificación, una nota de 5 también debería considerarse un aprobado.
La condición correcta sería:
nota = int(input("Nota: "))
if nota >= 5:
print("Aprobado")
else:
print("Suspenso")
Este ejemplo demuestra que un programa puede parecer correcto si solo lo probamos con unos pocos datos.
Por eso es recomendable utilizar distintos casos de prueba, especialmente aquellos que se encuentran en los límites de una condición.
Por ejemplo, en este programa sería conveniente probar las notas:
- 0
- 4
- 5
- 6
- 10
Observa que no solo probamos valores correctos e incorrectos, sino también los valores límite, ya que son los que con más frecuencia revelan errores lógicos.
Así podremos comprobar que el programa responde correctamente en todas las situaciones.
¿Sabías que…? Los valores situados en los límites de una condición (como 5 en este ejemplo) suelen ser los que más errores producen. Por eso es recomendable probar siempre esos casos antes de dar un programa por terminado.
5. Introducción a try y except
Hasta ahora, cuando un programa encuentra un error durante su ejecución, Python muestra un mensaje y el programa finaliza.
Por ejemplo, el siguiente programa espera que el usuario introduzca un número entero:
numero = int(input("Introduce un número: "))
print("Has escrito:", numero)
Si el usuario escribe:
hola
Python mostrará un mensaje de error y el programa terminará.
En algunos casos puede ser interesante evitar que esto ocurra y mostrar un mensaje más comprensible para la persona usuaria. Para ello Python dispone de las instrucciones try y except.
Por ejemplo:
try:
numero = int(input("Introduce un número: "))
print("Has escrito:", numero)
except:
print("Debes introducir un número entero.")
Si el usuario escribe un número, el programa funciona normalmente.
Si escribe un texto como hola, el programa no finaliza con un error, sino que muestra el mensaje:
Debes introducir un número entero.
En este curso utilizaremos principalmente los mensajes de error de Python y las técnicas básicas de depuración que hemos aprendido en este capítulo. Más adelante, cuando nuestros programas sean más completos, podremos utilizar try y except para controlar determinados errores y hacer que nuestras aplicaciones sean más robustas.
¿Sabías que…? La mayoría de las aplicaciones que utilizamos a diario emplean try y except para evitar que un error inesperado provoque el cierre del programa.
6. Errores habituales
Cuando comenzamos a programar es frecuente cometer algunos errores durante la depuración.
| Error | Solución |
|---|---|
| No leer el mensaje de error completo. | Revisar la última línea del mensaje y la línea del programa donde aparece el problema. |
| Probar el programa solo con un ejemplo. | Ejecutarlo varias veces utilizando distintos datos. |
| Modificar muchas líneas de código a la vez. | Realizar un cambio cada vez y volver a ejecutar el programa. |
| No comprobar el valor de las variables. | Utilizar print() para mostrar su contenido mientras se ejecuta el programa. |
Consejo: Si un programa deja de funcionar después de realizar varios cambios, intenta recordar cuál fue la última modificación que hiciste. Normalmente el error estará relacionado con ella.
Ya sabemos interpretar los mensajes de error, utilizar print() para comprobar el valor de las variables y verificar que un programa funciona correctamente mediante distintas pruebas. Estas técnicas básicas de detección y corrección de errores en Python nos acompañarán a partir de ahora en todos los programas que desarrollemos, ya que localizar y solucionar fallos forma parte del proceso habitual de programación.
En el siguiente capítulo aprenderemos a crear nuestras propias funciones, una herramienta fundamental para organizar el código, reutilizar instrucciones y desarrollar programas más claros y fáciles de mantener.
7. Actividad
Crea un archivo llamado depuracion.py.
El siguiente programa contiene varios errores. Tu objetivo es encontrarlos y corregirlos.
numero = int(input("Introduce un número: "))
if numero > 10
print("El número es mayor que 10.")
else:
print("El número es menor o igual que 10")
resultado = numero / 0
print("Fin del programa")
Realiza las siguientes tareas:
- Ejecuta el programa sin modificarlo.
- Lee el mensaje de error e identifica la línea donde se produce.
- Corrige el error y vuelve a ejecutar el programa.
- Repite el proceso hasta que el programa funcione correctamente.
- Añade una instrucción
print()para mostrar el valor de la variablenumeroantes de comprobar la condición. - Ejecuta el programa utilizando los siguientes valores:
- 5
- 10
- 15
Comprueba que el resultado obtenido es el esperado en cada caso.
Objetivo: aprender a localizar errores utilizando los mensajes que muestra Python, comprobar el valor de las variables mediante
print()y verificar que un programa funciona correctamente probándolo con distintos datos.
8. Prácticas resueltas
Los siguientes ejercicios permiten practicar algunas técnicas básicas de detección y corrección de errores en Python. Intenta localizar el problema antes de consultar la solución.
8.1. Corregir un error de sintaxis
El siguiente programa contiene un error.
edad = int(input("Edad: "))
if edad >= 18
print("Mayor de edad")
Corrige el programa para que funcione correctamente.
Solución
edad = int(input("Edad: "))
if edad >= 18:
print("Mayor de edad")
8.2. Localizar un error lógico
Este programa pretende indicar si una persona ha aprobado.
nota = int(input("Nota: "))
if nota > 5:
print("Aprobado")
else:
print("Suspenso")
¿Por qué una nota de 5 aparece como suspensa? Corrige el programa.
Solución
nota = int(input("Nota: "))
if nota >= 5:
print("Aprobado")
else:
print("Suspenso")
8.3. Comprobar el valor de una variable
El siguiente programa calcula el doble de un número.
Añade una instrucción print() para mostrar el contenido de la variable antes de calcular el resultado.
Solución
numero = int(input("Número: "))
print("Valor introducido:", numero)
doble = numero * 2
print("El doble es", doble)
8.4. Probar distintos casos
Escribe un programa que indique si un número es positivo o no.
Después ejecútalo utilizando los siguientes valores:
- 10
- 1
- 0
- -3
Comprueba que el resultado es correcto en todos los casos.
Solución
if numero > 0:
print("Positivo")
elif numero == 0:
print("Cero")
else:
print("Negativo")
8.5. Interpretar un mensaje de error
¿Qué ocurrirá al ejecutar el siguiente programa?
numero = int(input("Número: "))
print("Has escrito " + numero)
Explica el motivo del error y corrígelo.
Solución
El programa produce un TypeError porque intenta concatenar una cadena de texto con un número entero.
Una posible solución es:
numero = int(input("Número: "))
print("Has escrito", numero)
También podría utilizarse:
print("Has escrito " + str(numero))
8.6. Evitar que el programa finalice por un dato incorrecto
El siguiente programa solicita un número entero al usuario:
numero = int(input("Introduce un número: "))
print("Has escrito:", numero)
Si el usuario escribe un texto en lugar de un número, el programa produce un error y termina.
Modifica el programa para que, si el dato introducido no es un número entero, muestre el mensaje:
Debes introducir un número entero.
Solución
try:
numero = int(input("Introduce un número: "))
print("Has escrito:", numero)
except:
print("Debes introducir un número entero.")
De esta forma, el programa no finaliza con un error si el usuario introduce un dato incorrecto, sino que muestra un mensaje más comprensible.
9. Test de autoevaluación
9.1. ¿Cuál es el primer paso cuando un programa produce un error?
a) Reiniciar el ordenador.
b) Leer el mensaje de error que muestra Python. ✅
c) Borrar el programa.
d) Cambiar varias líneas de código al mismo tiempo.
Retroalimentación: Los mensajes de error suelen indicar dónde se encuentra el problema.
9.2. ¿Para qué se utiliza print() durante la depuración?
a) Para borrar variables.
b) Para comprobar el valor de las variables. ✅
c) Para detener el programa.
d) Para crear funciones.
Retroalimentación: Mostrar el contenido de las variables ayuda a entender cómo se está ejecutando el programa.
9.3. ¿Qué tipo de error produce un programa que se ejecuta sin fallar pero obtiene un resultado incorrecto?
a) Error lógico. ✅
b) SyntaxError.
c) IndentationError.
d) NameError.
Retroalimentación: El programa funciona, pero el resultado no es el esperado.
9.4. ¿Qué error aparece cuando olvidamos escribir los dos puntos al final de un if?
a) NameError.
b) TypeError.
c) SyntaxError. ✅
d) ValueError.
Retroalimentación: Python detecta un error de sintaxis antes de ejecutar el programa.
9.5. ¿Qué es recomendable hacer antes de dar un programa por terminado?
a) Ejecutarlo una sola vez.
b) Probarlo con diferentes datos. ✅
c) Cambiar todas las variables.
d) Eliminar los comentarios.
Retroalimentación: Probar distintos casos ayuda a descubrir errores que podrían pasar desapercibidos.
9.6. ¿Para qué se utiliza try y except?
a) Para repetir automáticamente un programa.
b) Para evitar que el programa finalice cuando se produce un determinado error. ✅
c) Para crear funciones.
d) Para mostrar comentarios.
Retroalimentación: try y except permiten controlar determinados errores para que el programa continúe ejecutándose mostrando un mensaje adecuado.
9.7. ¿Cuál de estas prácticas es la más recomendable al corregir un error?
a) Modificar muchas líneas de código a la vez.
b) Realizar un cambio cada vez y volver a ejecutar el programa. ✅
c) Borrar todo el programa.
d) Cambiar el nombre del archivo.
Retroalimentación: Así es más fácil comprobar qué cambio ha solucionado el problema.
9.8. ¿Qué error contiene este programa?
if numero > 0
print("Positivo")
a) Error lógico.
b) SyntaxError. ✅
c) TypeError.
d) NameError.
Retroalimentación: Falta el carácter : al final del if.
9.9. ¿Qué resultado produce este programa?
nota = 5
if nota > 5:
print("Aprobado")
else:
print("Suspenso")
a) Aprobado.
b) Suspenso. ✅
c) Error.
d) No muestra nada.
Retroalimentación: El programa funciona, pero contiene un error lógico.
9.10. ¿Qué técnica ayuda a comprobar cómo cambian las variables durante la ejecución?
a) Utilizar print(). ✅
b) Utilizar input().
c) Utilizar break.
d) Utilizar continue.
Retroalimentación: Mostrar el contenido de las variables facilita la depuración.
9.11. ¿Cuál de estas afirmaciones es correcta?
a) Todos los errores impiden ejecutar el programa.
b) Los errores lógicos permiten que el programa se ejecute, pero el resultado puede ser incorrecto. ✅
c) Los errores de sintaxis aparecen al finalizar el programa.
d) Los errores lógicos siempre muestran un mensaje de error.
Retroalimentación: Los errores lógicos suelen ser los más difíciles de detectar.
9.12. ¿Qué debemos hacer si un programa funciona con un dato pero falla con otro?
a) Probar únicamente el dato que funciona.
b) Revisar el programa utilizando diferentes casos de prueba. ✅
c) Cambiar el nombre de las variables.
d) Reiniciar Python.
Retroalimentación: Es importante comprobar que el programa responde correctamente en distintas situaciones.
9.13. ¿Qué error es más fácil detectar antes de ejecutar el prog¿Qué ocurrirá si el usuario escribe hola en este programa?
try:
numero = int(input("Número: "))
print(numero)
except:
print("Dato no válido")
a) El programa finaliza mostrando un error.
b) Se muestra el mensaje «Dato no válido». ✅
c) El programa se bloquea.
d) No ocurre nada.
Retroalimentación: Si se produce un error al convertir el dato introducido, el bloque except muestra el mensaje indicado y el programa continúa.
9.14. ¿Por qué es útil probar valores límite, como 0, 1 o 5?
a) Porque el programa se ejecuta más rápido.
b) Porque suelen revelar errores lógicos. ✅
c) Porque ocupan menos memoria.
d) Porque Python los trata de forma especial.
Retroalimentación: Muchos errores aparecen precisamente en los límites de una condición.
9.15. ¿Qué actitud es la más adecuada cuando aparece un error?
a) Borrar el programa.
b) Leer el mensaje, analizar el problema y corregirlo paso a paso. ✅
c) Cambiar todo el código.
d) Ignorar el error.
Retroalimentación: Depurar consiste en localizar el problema y resolverlo de forma ordenada.
10. Actividad de ampliación
Descubre el depurador de Visual Studio Code
Además de utilizar print() para comprobar el funcionamiento de un programa, los entornos de desarrollo incorporan herramientas que permiten ejecutar el código paso a paso y observar cómo cambian las variables.
Investiga el depurador (Debugger) de Visual Studio Code y responde a las siguientes cuestiones:
- ¿Qué es un punto de interrupción (breakpoint)?
- ¿Qué ocurre cuando el programa alcanza un breakpoint?
- ¿Qué información pueden consultarse durante la depuración?
- ¿Qué diferencia existe entre utilizar
print()y utilizar el depurador?
Como apoyo a tu investigación, puedes consultar la documentación oficial de Visual Studio Code:
No es necesario comprender todas las opciones del depurador. El objetivo es conocer que existen herramientas que permiten ejecutar un programa paso a paso y observar el valor de las variables mientras se ejecuta.
Objetivo: conocer una de las herramientas más utilizadas por las personas programadoras para localizar errores y comprender el funcionamiento de sus programas.