Depuración de errores

La depuración (o debugging en inglés) es el proceso de identificar, analizar y corregir errores o defectos en el código de un programa.
Es una parte crucial del desarrollo de software, ya que permite asegurar que el programa funcione correctamente y cumpla con los requisitos esperados. La depuración puede implicar la revisión de código, la ejecución de pruebas y el uso de herramientas especializadas.
Tipos
Los errores en programación pueden clasificarse en varias categorías, dependiendo de su naturaleza o del momento en que se producen.
Dependiendo de su naturaleza
- Errores de sintaxis: Errores que ocurren cuando el código no sigue la gramática o la sintaxis del lenguaje de programación. Estos errores impiden que el código se compile o se interprete correctamente. Por ejemplo: falta de punto y coma, paréntesis sin cerrar, o errores en la declaración de variables.
- Errores de tipo: Errores que se producen cuando una operación o función se aplica a un valor de un tipo de dato incompatible o inesperado, por ejemplo, sumar un número y una cadena de texto, o intentar usar como número algo que en realidad es texto. En Python, muchos de estos errores se detectan en tiempo de ejecución como una excepción
TypeError, pero otras veces pasan desapercibidos y el programa sigue funcionando con un dato del tipo equivocado, hasta que provocan un fallo (o un resultado incorrecto) más adelante. - Errores de lógica: Errores que causan que el programa se comporte de manera incorrecta, aunque el código se compile y ejecute sin errores de sintaxis. Estos errores son normalmente causados por una lógica incorrecta o incompleta en el código. Por ejemplo: cálculos incorrectos, condiciones mal definidas, o errores en la implementación de algoritmos.
Dependiendo del momento en que se producen
- Errores en tiempo de ejecución (runtime errors): Errores que ocurren durante la ejecución del programa, provocando que el programa se detenga inesperadamente. Estos errores son difíciles de prever durante el desarrollo y pueden ser causados por entradas inesperadas o situaciones inusuales. Por ejemplo: división por cero, acceso a índices fuera de rango, o intentos de acceder a recursos no disponibles.
- Errores de tiempo de compilación: Errores que ocurren durante la fase de compilación de un programa, antes de que el programa se ejecute. Estos errores están relacionados con el código que no puede ser traducido a código máquina. Por ejemplo: errores de sintaxis, referencias a variables no declaradas o tipos incompatibles. Nota: estos errores no ocurren en los lenguajes interpretados.
Depuración con el depurador de VSCode
Además de las trazas con print(), VSCode incluye un depurador integrado (proporcionado por la extensión Python) que permite ejecutar un programa paso a paso, deteniéndolo en el punto que decidas y inspeccionando el valor de cada variable en ese momento exacto, sin tener que ir añadiendo y quitando print() por el código.
Puntos de interrupción (breakpoints)
Un punto de interrupción (breakpoint) marca una línea en la que el programa se detendrá justo antes de ejecutarla, dejándolo "congelado" en ese instante.
Para colocar uno, haz clic en el margen izquierdo del editor, justo a la izquierda del número de línea: aparecerá un círculo rojo. Puedes colocar tantos puntos de interrupción como necesites, y quitarlos volviendo a hacer clic sobre el círculo.
Iniciar la depuración
Con al menos un punto de interrupción colocado, pulsa F5 (o el icono de Run and Debug ▷🐞 en la barra lateral, y después Run and Debug de nuevo) para ejecutar el script en modo depuración. Si es la primera vez, VSCode te pedirá elegir una configuración: selecciona "Python File".
El programa se ejecutará con normalidad hasta llegar al primer punto de interrupción, donde se detendrá. La línea donde está parado queda resaltada.
El panel de variables
Mientras el programa está detenido, en la barra lateral se abre el panel Run and Debug, con varias secciones:
- Variables: muestra el nombre y el valor actual de todas las variables visibles en ese punto del programa (las locales de la función donde estés, y las globales). Se actualiza automáticamente cada vez que avanzas un paso.
- Watch: te permite añadir a mano una expresión concreta que quieras vigilar de cerca.
- Call Stack (pila de llamadas): muestra la cadena de llamadas a función que te ha traído hasta este punto (útil para saber, si estás dentro de una función, quién la llamó).
- Breakpoints: lista todos los puntos de interrupción activos.
Ejecución paso a paso
Con el programa detenido en un punto de interrupción, la barra de controles de depuración (arriba del editor) te permite avanzar de la siguiente manera:
- Continue (F5): reanuda la ejecución normal hasta el siguiente punto de interrupción (o hasta que el programa termine).
- Step Over (F10): ejecuta la línea actual completa y pasa a la siguiente, sin entrar en el código de las funciones que esa línea llame (las ejecuta de una vez, como una caja negra).
- Step Into (F11): si la línea actual llama a una función, entra dentro de ella y te deja parado en su primera línea, para poder seguir su ejecución paso a paso también por dentro.
- Step Out (SHIFT+F11): si estás dentro de una función (por haber usado Step Into), termina de ejecutarla entera de golpe y te devuelve a la línea siguiente de quien la llamó.
- Stop (SHIFT+F5): detiene la depuración por completo.

Usa Step Over cuando confías en que una función funciona bien y no necesitas ver su ejecución por dentro (por ejemplo, print() o len()). Usa Step Into cuando la función que se llama es precisamente la que sospechas que tiene el error, y necesitas ver qué ocurre línea a línea dentro de ella.