Skip to content
Back to Blog

Cómo leer un stack trace y corregir el error

Un stack trace parece ruido hasta que sabes cómo leerlo. Esta guía descifra trazas en Python y JavaScript y muestra cómo encontrar la línea que realmente falló.

SZ
Founder, Molixa
12 min read
Compartir
Cómo leer un stack trace y corregir el error
Table of contents8 sections

Cuando pegas un stack trace en un buscador y piensas "solo explícame este stack trace de error", en realidad estás haciendo dos preguntas: qué falló y qué línea de tu código lo causó. Un stack trace responde ambas, pero solo si lo lees en el orden correcto. Esta guía enseña la habilidad general de decodificar cualquier traza, en Python o JavaScript, para que dejes de adivinar y empieces a arreglar.

La mayoría de los tutoriales responden un error específico y te dejan perdido con el siguiente. La habilidad que realmente se transfiere es leer la traza en sí: saber dónde está la causa real, qué marcos ignorar y cómo convertir cuarenta líneas de jerga en un diagnóstico de una sola frase. Esa habilidad funciona con cualquier error que encuentres.

Qué es realmente un Stack Trace#

Un stack trace es una instantánea de la pila de llamadas en el momento exacto en que su programa falló. Enumera cada función que se estaba ejecutando, en el orden en que fueron llamadas, junto con el tipo de error y el mensaje en el punto de fallo. Si lo lees correctamente, apunta directamente a la línea defectuosa.

Piensa en él como una cadena de "quién llamó a quién". Tu programa entra en main, que llama a processOrder, que llama a chargeCard, que lanza una excepción. El trace registra toda esa cadena para que puedas retroceder desde el síntoma hasta la causa.

Dos partes son las más importantes:

  • El tipo de excepción y el mensaje: qué tipo de fallo ocurrió (un TypeError, un KeyError, una referencia nula) y una breve descripción en lenguaje humano.
  • Los frames: la lista ordenada de llamadas a funciones, cada una con un nombre de archivo y un número de línea.

Consejo rápido: el mensaje de error te dice qué salió mal. Los frames te dicen dónde. Casi siempre necesitas ambos para solucionarlo, y quienes se estancan suelen leer solo uno.

Cómo leer un stack trace de arriba a abajo#

Aquí está la parte que confunde a muchos: Python y JavaScript ordenan sus trazas en direcciones opuestas. Si entiendes la dirección correcta, todo lo demás encaja.

Python: leer de abajo arriba#

En Python, la traza se imprime con la llamada más antigua primero y la más reciente al final. El encabezado dice Traceback (most recent call last), que es la instrucción completa. La excepción real está en la última línea, y la línea de código que la desencadenó está justo encima.

Traceback (most recent call last):
  File "app.py", line 42, in <module>
    main()
  File "app.py", line 30, in main
    total = calculate_total(cart)
  File "app.py", line 18, in calculate_total
    return sum(item["price"] for item in cart)
KeyError: 'price'

Empieza desde abajo. KeyError: 'price' significa que un diccionario no tenía la clave price. La línea directamente arriba muestra exactamente dónde: línea 18, dentro de calculate_total, en esa expresión generadora. Todo lo que está encima de la línea 18 solo indica cómo llegó el programa hasta allí. Arreglas la línea 18 (o los datos que la alimentan), no main.

JavaScript: leer de arriba abajo#

JavaScript lo invierte. El mensaje de error está en la primera línea, y el marco superior es donde se lanzó el error. Lees hacia abajo solo hasta llegar a tu propio código.

TypeError: Cannot read properties of undefined (reading 'name')
    at renderUser (app.js:24:18)
    at renderList (app.js:51:9)
    at App (app.js:78:5)
    at react-dom.production.min.js:118:188

La primera línea es el diagnóstico: algo intentó leer .name en un valor que era undefined. El primer marco, renderUser en la línea 24, es donde ocurrió. Los marcos debajo son los llamadores. El marco inferior aquí está en react-dom, código de librería que no escribiste, así que lo omites.

Encontrar la línea que realmente falló#

El hábito más útil es este: escanea los marcos y encuentra el primero que apunte a tu archivo, no a una biblioteca o al entorno de ejecución. Ese marco es casi siempre donde debes mirar primero.

Un rastro real es un sándwich. La parte superior (JS) o inferior (Python) es la excepción en bruto. El medio es una mezcla de tu código y el código del framework. El truco es filtrar:

  • Ignora los marcos del framework a menos que todos los marcos sean del framework (entonces probablemente estás llamando a una API incorrectamente).
  • Encuentra tu primer marco: el marco JS más alto o el marco Python más bajo con la ruta de tu propio archivo y número de línea.
  • Abre esa línea y lee el mensaje de error en relación con lo que hace la línea.

Empareja el mensaje con la línea. KeyError: 'price' junto a item["price"] significa que falta la clave. Cannot read properties of undefined (reading 'name') junto a user.name significa que user es undefined. El mensaje nombra la operación fallida; la línea muestra dónde la escribiste.

Leer el mensaje de error en sí#

El mensaje es una oración comprimida. Descifra los comunes y habrás descifrado la mayoría de los fallos que encontrarás.

Fragmento del mensaje de errorQué significaPrimero que verificar
Cannot read properties of undefined (reading 'x')Accediste a .x en algo que era undefinedPor qué el objeto está vacío o no se ha cargado aún
KeyError: 'x' (Python)Un diccionario no tiene la clave 'x'Ortografía, o si la clave siempre existe
TypeError: 'NoneType' object is not subscriptableIndexaste en NoneQué devolvió None en lugar de una lista/diccionario
IndexError: list index out of rangePediste un elemento más allá del final de una listaLímites del bucle, o una lista vacía
is not a function (JS)Llamaste a algo que no es invocableUn error tipográfico, o un valor que no es el que crees
Maximum call stack size exceededRecursión infinitaUna función que se llama a sí misma sin caso base

Un flujo de trabajo de depuración repetible#

Una vez que puedes leer un trace, intégralo en una rutina para que hagas siempre las mismas cinco cosas en lugar de entrar en pánico. Este flujo de trabajo marca la diferencia entre una solución de cinco minutos y una hora de frustración.

  1. Lee primero el tipo de excepción y el mensaje. Nombra el fallo en palabras sencillas antes de tocar nada.
  2. Encuentra tu primer marco. Abajo en Python, arriba en JavaScript. Ese archivo y número de línea es el punto cero.
  3. Abre esa línea y formula una hipótesis. "Esta variable no está definida aquí porque la solicitud fetch no se ha resuelto." Una frase.
  4. Verifica con un valor, no con una suposición. Imprime o registra la variable sospechosa justo antes de la línea que falla. Confirma que es lo que el mensaje afirma.
  5. Corrige la causa, no el síntoma. Un guardia nulo oculta el fallo, pero pregúntate por qué el valor era nulo. La solución real suele estar un marco arriba.

Ese último punto es donde la mayoría se equivoca. Envolver una línea en un try/except o un encadenamiento opcional ?. detiene el fallo sin arreglar nada. El trace te dio una pista gratuita: el valor estaba mal aguas arriba. Síguelo.

Advertencia: nunca "arregles" un trace eliminando la línea a la que apunta o capturando todas las excepciones en silencio. No estás eliminando el error, te estás vendando los ojos para el próximo.

Cuando los Traces Solo Apuntan a Código de Librería#

A veces cada frame está dentro de un framework o dependencia y ninguno apunta a tu archivo. Esto es desorientador, pero tiene un significado claro: le diste a la librería una entrada incorrecta o la llamaste de manera equivocada. La librería falló por tu culpa.

En ese caso, mira el frame más profundo que toca el límite entre tu código y el de ellos. Un driver de base de datos que lanza una excepción por una consulta mal formada, un analizador JSON que falla por una cadena rota, un enrutador que falla por una definición de ruta incorrecta. La solución está en el valor o la llamada que pasaste, aunque la explosión visible esté dentro de su código.

El código asíncrono añade otra complicación. Las promesas, callbacks y subprocesos pueden producir traces que "saltan" porque el fallo aparece lejos de donde se hizo la llamada original. Los runtimes modernos añaden frames asíncronos para ayudar, pero si un trace parece imposiblemente corto o desconectado, el origen real puede ser una promesa no esperada o un error tragado en otro lugar.

Deja que un Explicador de Código lo Descifre por Ti#

Leer trazas es una habilidad, y como cualquier habilidad, es lenta hasta que se vuelve rápida. Cuando te enfrentas a un error desconocido en un lenguaje que apenas tocas, pegar todo en una herramienta que lo explique en español sencillo te ahorra tiempo real. Nuestro explicador de código gratuito toma un traceback en bruto y devuelve el tipo de error, la causa probable y la línea a revisar, en modos para principiantes o avanzados.

La advertencia honesta: una explicación de IA es una hipótesis sólida, no un veredicto. Puede malinterpretar una pila inusual o inventar una causa que suene plausible. Trata su respuesta como tratarías la de un colega senior que echa un vistazo a tu pantalla, un indicio rápido en la dirección correcta que aún debes confirmar con la línea y el valor reales.

Dos hábitos rápidos de verificación te mantienen seguro:

  • Verifica el número de línea. Si la herramienta dice que el error está en la línea 18, abre la línea 18 y confirma que el mensaje coincida con lo que hace ese código.
  • Cuidado con APIs inventadas. Si una solución sugerida menciona un método o paquete que no reconoces, búscalo antes de confiar en él. Los nombres de funciones alucinados son la forma más común en que estas herramientas engañan.

Para errores que realmente son problemas de patrones, como una expresión regular que lanza o no coincide, combina la explicación con un probador de regex en vivo para depurar tu patrón para ver exactamente qué caracteres coinciden. Y si el explicador te da una carga JSON confusa enterrada en el error, pásala por el formateador JSON para hacer legible la estructura antes de seguir leyendo la traza.

Poniéndolo Todo Junto#

La próxima vez que necesites explicar este rastreo de errores, tendrás un proceso en lugar de pánico. Nombra la excepción, lee en la dirección correcta (de abajo arriba para Python, de arriba abajo para JavaScript), encuentra el primer marco en tu propio código y confirma tu hipótesis con un valor real antes de cambiar nada. El rastreo no es ruido. Es un mapa con el destino ya marcado.

Leer rastreos con fluidez es lo que separa a los desarrolladores que corrigen errores en minutos de aquellos que pierden tardes enteras. Crea el hábito con errores pequeños ahora, y los rastreos aterradores de cuarenta líneas dejarán de ser aterradores.

Preguntas Frecuentes#

¿Un stack trace se lee de arriba a abajo o de abajo a arriba? Depende del lenguaje. Python imprime primero la llamada más antigua y la excepción al final, por lo que se lee de abajo hacia arriba y la línea que falla está justo encima del mensaje de error final. JavaScript coloca el mensaje de error y el marco que lanza la excepción al principio, así que se lee de arriba hacia abajo. En ambos casos, buscas el primer marco que apunte a tu propio código.

¿Qué significa realmente "Cannot read properties of undefined"? Significa que tu código intentó acceder a una propiedad o método de un valor que era undefined. Por ejemplo, user.name cuando user nunca fue asignado. La solución rara vez está en esa línea; se trata de averiguar por qué el valor estaba vacío, lo que suele deberse a una carga de datos que no ha terminado o a un objeto que nunca se devolvió.

¿Qué línea del trace es la que debo corregir? Encuentra el primer marco que haga referencia a un archivo que escribiste, no a una biblioteca o al runtime. Esa línea es donde se manifestó el error. La causa real a veces está un marco arriba, donde se pasó un valor incorrecto, así que lee el mensaje junto con la línea y sigue los datos hacia atrás si la línea parece inocente.

¿Puedo confiar en una herramienta de IA para explicar mi stack trace? En general sí, como una primera lectura rápida. Un buen explicador de código identificará correctamente el tipo de error y te señalará el área correcta mucho más rápido que buscar en foros. Trata su solución específica como una hipótesis: confirma que el número de línea coincide con el código que falla y nunca pegues un método o paquete sugerido que no puedas verificar que existe.

¿Por qué mi trace solo muestra código de bibliotecas y ninguno de mis archivos? Eso suele significar que pasaste datos incorrectos a una biblioteca o llamaste a su API de forma incorrecta, por lo que el fallo ocurre dentro de su código en tu nombre. Busca el marco límite donde tu llamada entra en la biblioteca y verifica los valores o argumentos que le diste. La solución está en tu entrada, aunque la explosión ocurra en su código.

¿Qué hago con un stack trace asíncrono o de Promise que parece desconectado? Los errores asíncronos pueden aparecer lejos de donde se hizo la llamada original, por lo que el trace puede verse corto o saltar inesperadamente. Busca una promesa no esperada o un error absorbido río arriba, activa los stack traces asíncronos si tu runtime lo permite y agrega un registro justo antes del await sospechoso para confirmar qué valor tienes realmente en ese punto.

More from Molixa

Try Molixa Tools

50+ free AI tools for content creation, SEO, coding, and more. No signup, no watermark.

Explore all tools