Entender mensajes de error en inglés
En esta lección
Cuando un programa falla, te habla en inglés. Y lo hace con frases muy cortas y muy repetitivas. La buena noticia es que no hace falta traducirlas palabra por palabra: basta con reconocer la estructura del mensaje y unas cuarenta palabras clave. En esta lección verás cómo se organiza un error, qué es un stack trace, en qué se diferencian un error y un aviso y qué significa cada palabra importante. Todos los mensajes que ves aquí están sacados de ejecutar código real.
Para aprender el método de depuración (reproducir, aislar, arreglar), mira Depurar JavaScript con DevTools. Aquí nos centramos en entender el idioma.
La estructura de un error
Casi todos los errores tienen tres partes, aunque cambie el orden según el lenguaje.
TypeError: Cannot read properties of undefined (reading 'name')
at showUser (app.js:2:15)
at loadProfile (app.js:5:10)
at Object.<anonymous> (app.js:7:1)
| Parte | Ejemplo | Qué te dice |
|---|---|---|
| Type (tipo) | TypeError | La familia del problema |
| Message (mensaje) | Cannot read properties of undefined (reading 'name') | Qué ha pasado, en una frase |
| Location (lugar) | app.js:2:15 | Archivo, línea y columna |
| Stack trace | Las líneas con at | Quién llamó a quién hasta llegar aquí |
Traducción del mensaje: “No se pueden leer propiedades de undefined (al leer name)”. Es decir, intentaste hacer algo.name y algo valía undefined.
Cómo leerlo: de arriba abajo
- Mira el tipo y el mensaje: la primera línea. Te dice qué.
- Mira la primera línea con
at: es el lugar exacto del fallo. Te dice dónde. - Sube por el resto de líneas
at: es la cadena de llamadas que llevó hasta ahí. Te dice por qué camino.
En JavaScript la traza se lee de la llamada más reciente a la más antigua: showUser fue llamada por loadProfile, y esta por el código principal. En Python, en cambio, la traza se lee de arriba abajo, de la más antigua a la más reciente, y el mensaje va al final:
Traceback (most recent call last):
File "app.py", line 7, in <module>
print(total({"tent": 80}, ["tent", "rope"]))
File "app.py", line 5, in total
return sum(get_price(prices, n) for n in names)
File "app.py", line 2, in get_price
return prices[name]
KeyError: 'rope'
Traceback (most recent call last) significa “traza (la llamada más reciente, al final)”. Tienes que ir a la última línea para leer el error: KeyError: 'rope', “error de clave: ‘rope’”. Y justo encima, el lugar: File "app.py", line 2, in get_price (archivo app.py, línea 2, en la función get_price).
Java tiene el mismo estilo que JavaScript: error arriba y llamadas debajo.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at Stk.a(Stk.java:1)
at Stk.b(Stk.java:1)
at Stk.main(Stk.java:1)
“Excepción en el hilo ‘main’: el índice 3 está fuera de los límites para una longitud de 3”. Las líneas con at son la pila: método a llamado por b, llamado por main.
Nota: el stack (/stak/) es la pila de llamadas: cada función que se ejecuta se apila encima de la anterior. El trace (/treis/) es el rastro. Stack trace se pronuncia /stak treis/ y se traduce como “traza de la pila”.
Error, warning y otros niveles
No todo lo que sale en rojo o amarillo es igual de grave.
| Inglés | Pronunciación | Significado | ¿Detiene el programa? |
|---|---|---|---|
| error | /érror/ | error: algo ha fallado | Normalmente sí |
| exception | /eksépshon/ | excepción: un error que se puede capturar | Si no se captura, sí |
| warning | /uórnin/ | aviso: algo sospechoso, pero sigue | No |
| deprecated | /déprikeitid/ | obsoleto: funciona hoy, pero se eliminará | No |
| info | /ínfo/ | información | No |
| debug | /dibág/ | mensajes para depurar | No |
| fatal | /féitl/ | fatal: no se puede continuar | Sí |
| crash | /crash/ | colapso: el programa se cae | Sí |
Un ejemplo real de un deprecation warning de Python:
DeprecationWarning: this function is deprecated
“Aviso de obsolescencia: esta función está obsoleta”. No es un error, pero te avisa de que debes buscar otra forma de hacerlo.
Un error de compilación (compile error) se detecta antes de ejecutar el programa. Un error de ejecución (runtime error, /rántaim/) ocurre mientras se ejecuta. Los errores de sintaxis (syntax error) son fallos al escribir el código; los errores lógicos (logic errors) son los más difíciles: el programa funciona, pero hace algo equivocado.
Palabras clave de los errores
Estas palabras aparecen en casi todos los mensajes. Apréndelas en bloque.
Esperar y encontrar
| Inglés | Pronunciación | Significado | Ejemplo real |
|---|---|---|---|
| expected | /ekspéctid/ | se esperaba | ';' expected (Java) |
| unexpected | /anekspéctid/ | inesperado | Unexpected token ';' (JS) |
| found | /fáund/ | encontrado | expected a number, found a string |
| missing | /mísin/ | falta | missing 1 required positional argument (Python) |
| required | /rikuáierd/ | obligatorio | required field |
| not found | /not fáund/ | no encontrado | File not found |
| no such | /nóu sach/ | no existe tal | no such table: usres (SQL) |
| unknown | /annóun/ | desconocido | Unknown column |
Ejemplos reales:
SyntaxError: Unexpected token ';'
“Error de sintaxis: símbolo (token) inesperado ’;’”. Has puesto un ; donde el lenguaje no lo esperaba.
TypeError: f() missing 1 required positional argument: 'b'
“A f() le falta 1 argumento posicional obligatorio: b”. Llamaste a la función con menos argumentos de los que necesita.
Valores y tipos
| Inglés | Pronunciación | Significado | Ejemplo real |
|---|---|---|---|
| undefined | /andifáind/ | sin definir | x is not defined |
| null | /nal/ | nulo, vacío | Cannot read properties of null |
| invalid | /inválid/ | no válido | Invalid array length |
| illegal | /ilíguel/ | ilegal, no permitido | illegal operation on a directory |
| incompatible | /incompátibol/ | incompatible | incompatible types |
| cannot / can’t | /cánot/, /cant/ | no puede | Cannot read properties |
| not a function | /not a fánkshon/ | no es una función | p.calcular is not a function |
| not defined | /not difáind/ | no definido | totl is not defined |
| must be | /mast bi/ | debe ser | must be of type string |
| already exists | /olrédi egzísts/ | ya existe | table users already exists |
Permisos y recursos
| Inglés | Pronunciación | Significado | Ejemplo real |
|---|---|---|---|
| permission denied | /permíshon dináid/ | permiso denegado | EACCES: permission denied |
| access denied | /ákses dináid/ | acceso denegado | Access denied for user 'root' (bases de datos) |
| forbidden | /forbíden/ | prohibido | 403 Forbidden |
| unauthorized | /anózoraizd/ | no autorizado (sin login) | 401 Unauthorized |
| failed | /féild/ | falló | Failed to fetch |
| refused | /rifiúsd/ | rechazado | ECONNREFUSED |
| timeout | /táimaut/ | tiempo de espera agotado | The operation was aborted due to timeout |
| timed out | /táimd aut/ | se agotó el tiempo | Connection timed out |
| unavailable | /anavéilabol/ | no disponible | 503 Service Unavailable |
Ejemplo real al leer un archivo sin permiso:
Error: EACCES: permission denied, open 'secret.txt'
“Error: EACCES: permiso denegado, al abrir secret.txt”. EACCES es el código (access) y open 'secret.txt' es lo que se intentaba hacer.
Y al conectarte a un servidor que no responde:
connect ECONNREFUSED 127.0.0.1:1
“Conexión rechazada (connection refused) a la dirección 127.0.0.1, puerto 1”. Probablemente el servidor no está en marcha.
Tamaños y límites
| Inglés | Pronunciación | Significado | Ejemplo real |
|---|---|---|---|
| out of range | /áut of réinch/ | fuera de rango | list index out of range (Python) |
| out of bounds | /áut of báunds/ | fuera de límites | Index 3 out of bounds for length 3 (Java) |
| overflow | /óuverflou/ | desbordamiento | stack overflow |
| exceeded | /eksídid/ | excedido | Maximum call stack size exceeded |
| too many / too few | /tu méni/, /tu fiú/ | demasiados / muy pocos | too many arguments |
| maximum / minimum | /máksimum/ | máximo / mínimo | maximum recursion depth exceeded |
| length | /lenz/ | longitud | for length 3 |
| limit | /límit/ | límite | rate limit exceeded |
Un ejemplo real de recursividad sin fin en Python:
RecursionError: maximum recursion depth exceeded
“Error de recursión: profundidad máxima de recursión excedida”. Una función se llama a sí misma sin parar.
Leer un error paso a paso
Este es el método con un ejemplo real de Python:
IndexError: list index out of range
- Tipo:
IndexError, un error de índice. - Palabras clave:
list,index,out of range. - Traducción: “índice de lista fuera de rango”.
- Conclusión: intentaste acceder a una posición que no existe en la lista.
Otro ejemplo, esta vez de JavaScript:
ReferenceError: totl is not defined
- Tipo:
ReferenceError, un error de referencia. - Palabra clave:
is not defined→ “no está definido”. - Conclusión: usas un nombre (
totl) que no existe. Seguro que querías escribirtotal.
Consejo: cuando uses el mensaje de error para buscar en internet, copia el texto sin tu nombre de variable ni tus rutas: busca
Cannot read properties of undefineden vez deCannot read properties of undefined (reading 'name') en mi archivo C:\Users\ana\.... Así encuentras más resultados.
Códigos de estado HTTP
Si trabajas con la web, verás números con texto en inglés. Los más comunes:
| Código | Texto | Significado |
|---|---|---|
| 200 | OK | Todo bien |
| 201 | Created | Recurso creado |
| 301 | Moved Permanently | La dirección ha cambiado |
| 400 | Bad Request | Petición mal formada |
| 401 | Unauthorized | Falta iniciar sesión |
| 403 | Forbidden | No tienes permiso |
| 404 | Not Found | No existe |
| 500 | Internal Server Error | Fallo en el servidor |
| 503 | Service Unavailable | Servicio no disponible |
Los números que empiezan por 4 indican un problema del cliente (tú); los que empiezan por 5, del servidor.
Errores frecuentes
- Traducir todo el error con el traductor. Los nombres de tipos (
TypeError,KeyError) y las funciones no se traducen: tradúcelo tú por partes. - Mirar solo la primera línea en Python. El error está en la última. Léelo de abajo arriba.
- Confundir
errorconwarning. Un warning no detiene el programa, pero ignorarlo puede traerte problemas más tarde. - Buscar sin comillas un mensaje largo. Si lo pones entre comillas, el buscador busca la frase exacta, y así encuentras antes a quien tuvo el mismo problema.
- Confundir
forbiddenconunauthorized.401es “no sé quién eres” y403es “sé quién eres, pero no tienes permiso”. - No mirar la línea y la columna.
app.js:2:15te lleva casi directo al fallo.
Resumen
| Palabra | Significado |
|---|---|
| error / exception / warning | fallo / excepción / aviso |
| expected / unexpected | esperado / inesperado |
| missing / required | falta / obligatorio |
| not found / no such | no encontrado / no existe tal |
| not defined / undefined | no definido / sin valor |
| invalid / illegal | no válido / no permitido |
| permission denied / forbidden | permiso denegado / prohibido |
| failed / refused / timeout | falló / rechazado / tiempo agotado |
| out of range / out of bounds | fuera de rango / de límites |
| overflow / exceeded | desbordamiento / excedido |
Ahora que conoces las palabras, vemos los errores reales más comunes de cada lenguaje en Errores por lenguaje.
Pon a prueba lo que has aprendido
¿Te ha quedado claro? Márcala y verás tu progreso en el explorador.