Menu

Tipos de errores en JavaScript: Syntax, Type y Reference

Los tipos de error que trae JavaScript de fábrica: qué significa cada uno, cuándo aparecen y cómo leer el mensaje sin andar adivinando.

Los errores son objetos con un tipo

Cuando JavaScript lanza un error, no te devuelve un simple string: te devuelve un objeto. Ese objeto tiene un tipo (su constructor) y varias propiedades estándar: name, message y stack.

index.js
Output
Click Run to see the output here.

err.name es una etiqueta corta como "TypeError". err.message es la descripción legible para humanos. Con err instanceof TypeError sabes exactamente de qué clase se trata. Conocer el tipo importa: te dice si el problema es una errata, un valor incorrecto o código que ni siquiera se pudo parsear.

Existen siete tipos de errores integrados en JavaScript. Tres los vas a ver todo el tiempo; los otros cuatro aparecerán de vez en cuando.

SyntaxError en JavaScript: cuando el código no parsea

Un SyntaxError significa que JavaScript ni siquiera pudo leer tu código. En realidad no es un error en tiempo de ejecución: el motor falla durante el parseo, antes de que se ejecute una sola línea. No puedes capturarlo con try/catch dentro del mismo archivo, porque el archivo entero queda descartado.

function greet(name {
    return "hi, " + name;
}
// SyntaxError: Unexpected token '{'

Un corchete que falta, una coma de más, un return fuera de una función… cualquier cosa que rompa la gramática del lenguaje lanza este error. La solución siempre pasa por corregir el código fuente. El único caso en el que sí puedes atrapar un SyntaxError es cuando el parseo ocurre en tiempo de ejecución, como sucede con JSON.parse:

index.js
Output
Click Run to see the output here.

JSON.parse recibe una cadena en tiempo de ejecución, así que sus errores de sintaxis sí se pueden atrapar con try/catch. Los errores en tus propios archivos fuente, no.

ReferenceError: ese nombre no existe

Un ReferenceError salta cuando haces referencia a una variable que no se ha declarado en ningún ámbito visible desde el código actual.

index.js
Output
Click Run to see the output here.

El noventa por ciento de las veces se trata de un typo (totl en lugar de total). El otro diez por ciento es cosa del scope: estás intentando usar algo declarado en otra función u otro módulo.

Hay una causa más sutil: la temporal dead zone (zona muerta temporal). Las declaraciones con let y const existen desde el inicio de su bloque, pero no puedes acceder a ellas antes de la línea que las declara:

index.js
Output
Click Run to see the output here.

x sí es un binding real cuando se ejecuta console.log(x), lo que pasa es que todavía no se ha inicializado. De ahí viene el error de referencia. La solución es mover el acceso a una línea posterior a la declaración.

TypeError: el valor tenía la forma equivocada

Un TypeError significa que el valor existe, pero no es del tipo que la operación espera. Llamar a algo que no es una función, leer una propiedad de null o undefined, asignar a una const... todos son TypeError.

index.js
Output
Click Run to see the output here.

"Cannot read properties of null (reading 'name')" es, probablemente, el mensaje de error más común de todo JavaScript. La solución pasa por asegurarte de que el valor existe, o bien por proteger el acceso con optional chaining: user?.name.

Otras variantes del TypeError:

index.js
Output
Click Run to see the output here.

Llamar a un número como si fuera función, reasignar una const o invocar un método que no existe: el valor no era del tipo correcto para lo que le pediste.

RangeError: el número está fuera de rango

El RangeError se dispara cuando un número es técnicamente válido, pero queda fuera del rango permitido para una operación concreta.

index.js
Output
Click Run to see the output here.

Una fuente clásica es la recursión infinita, que revienta la pila de llamadas:

index.js
Output
Click Run to see the output here.

"Maximum call stack size exceeded" casi siempre significa que una función se está llamando a sí misma sin un caso base, o que dos funciones se están llamando entre sí en bucle.

URIError y EvalError: los raros

URIError aparece cuando las funciones de manejo de URI (encodeURI, decodeURIComponent y compañía) reciben una entrada mal formada:

index.js
Output
Click Run to see the output here.

EvalError es una reliquia. Los motores modernos de JavaScript ya no lo lanzan para nada; solo sigue existiendo como constructor por compatibilidad con código antiguo. Puedes crearlo a mano, pero no te lo vas a topar en el código real.

La cadena de herencia

Todos estos tipos de errores heredan de un Error base. Esto significa que err instanceof Error devuelve true para cualquiera de ellos, lo cual viene de perlas en un catch genérico:

index.js
Output
Click Run to see the output here.

Un bloque catch atrapa todo — incluso valores que no son errores si alguien hace throw "oops". Esa última rama importa. Siempre acota con instanceof antes de tratar el valor capturado como un objeto de error.

Cómo lanzar errores a propósito

Tú mismo puedes lanzar cualquiera de los tipos integrados cuando tu código detecte un problema. Elige el tipo que mejor describa el fallo:

index.js
Output
Click Run to see the output here.

Elegir el tipo adecuado para cada fallo no es solo una cuestión estética: permite que quien consume tu código escriba bloques catch más precisos, en lugar de andar parseando mensajes de error con cadenas.

Crear errores personalizados en JavaScript

Cuando ninguno de los tipos nativos encaja bien con tu caso, lo mejor es extender Error:

index.js
Output
Click Run to see the output here.

Dos cosas importantes: llama a super(message) para que la clase base Error se inicialice bien, y asigna this.name para que los logs muestren la etiqueta correcta. Los campos personalizados como field permiten que quien llame reaccione a fallos concretos sin tener que parsear cadenas de texto.

Siguiente paso: la consola y las DevTools

Conocer los tipos de errores en JavaScript es solo la mitad del camino. La otra mitad es saber leer un stack trace y husmear el estado mientras el programa se ejecuta. Las devtools del navegador (y el debugger de Node) convierten ese "lanzó un error y no tengo idea de por qué" en unos segundos de inspección. Eso lo vemos a continuación.

Preguntas frecuentes

¿Cuáles son los tipos de error que trae JavaScript?

Son siete: Error (la clase base), SyntaxError, ReferenceError, TypeError, RangeError, URIError y EvalError. Cada uno es un constructor que devuelve un objeto con las propiedades name, message y stack. En el día a día vas a cruzarte sobre todo con SyntaxError, ReferenceError y TypeError.

¿Qué diferencia hay entre un SyntaxError y un TypeError?

Un SyntaxError significa que el código no es JavaScript válido: el motor ni siquiera consigue parsearlo. Un TypeError, en cambio, aparece cuando el código sí se parseó bien pero hace algo ilegal en tiempo de ejecución, como llamar a algo que no es una función o leer una propiedad de null. Los errores de sintaxis tumban el script entero; los de tipo solo saltan cuando se ejecuta la línea problemática.

¿Cuándo salta un ReferenceError en JavaScript?

Cuando usas un nombre que no has declarado o accedes a una variable let/const dentro de su zona muerta temporal (antes de que se ejecute la declaración). La causa más típica son las erratas: consoel.log(x) lanza ReferenceError: consoel is not defined. Revisa primero cómo lo has escrito y el ámbito.

¿Puedo crear mis propios tipos de error?

Sí. Basta con extender la clase Error integrada: class ValidationError extends Error { }. Asigna this.name en el constructor para que los logs y los catch puedan distinguirlo. Crear clases de error propias merece la pena cuando cada tipo de fallo necesita un manejo distinto.

Aprende a programar con Coddy

COMENZAR