Command Palette

Search for a command to run...

throw: Lanzar Errores en JavaScript

Aprende a lanzar errores personalizados usando la palabra clave throw para controlar el flujo de excepciones y validar datos de forma efectiva.

Lectura: 10 min
Nivel: Principiante

TL;DR - Resumen rápido

  • throw permite lanzar errores personalizados manualmente en cualquier punto del código
  • Siempre lanza objetos Error para tener propiedades name, message y stack
  • Puedes lanzar diferentes tipos de errores nativos (TypeError, ReferenceError, etc.)
  • Re-lanzar errores con throw para propagarlos al nivel superior
  • Usa throw para validación de datos, no para control de flujo normal

Introducción a throw

La palabra clave throw en JavaScript te permite lanzar excepciones manualmente. Mientras que try/catch captura errores que ocurren naturalmente, throw te da control total sobre cuándo y qué tipo de error se lanza. Esto es especialmente útil para validación de datos, manejo de casos edge y comunicación de problemas entre diferentes niveles de tu aplicación.

Cuando usas throw, estás lanzando una excepción que interrumpe el flujo normal de ejecución y busca el bloque catch más cercano que pueda manejar esa situación. Una "excepción" es el evento de interrumpir el flujo, mientras que el "error" es el objeto que representa el problema. Si no hay un catch apropiado, el error se propagará hasta el nivel superior de la aplicación, posiblemente causando que el programa colapse.

  • <strong>Validación de datos</strong>: Lanzar errores cuando los datos no cumplen requisitos
  • <strong>Casos edge</strong>: Manejar situaciones excepcionales que no son errores normales
  • <strong>Comunicación entre niveles</strong>: Propagar errores desde funciones internas
  • <strong>Control de flujo</strong>: Interrumpir ejecución en casos críticos

Sintaxis Básica de throw

La sintaxis básica de throw es simple: la palabra clave seguida de una expresión que representa el error. Aunque puedes lanzar cualquier tipo de valor, la práctica recomendada es siempre lanzar objetos de tipo Erroro sus subclases para tener acceso a propiedades estándar como message,name y stack.

sintaxis-basica.js
Loading code...

Este ejemplo muestra la sintaxis básica de throw con diferentes escenarios. Primero lanzamos un error simple, luego un TypeErrorespecífico, y finalmente mostramos cómo lanzar errores con mensajes dinámicos basados en validaciones de datos.

Siempre lanza objetos Error

Aunque JavaScript permite lanzar strings, números u otros valores, siempre lanza objetos Error o sus subclases. Esto garantiza que el error tenga las propiedades estándar name, message ystack que son esenciales para debugging y manejo de errores.

Tipos de Errores Nativos

JavaScript proporciona varios tipos de errores nativos como TypeError,ReferenceError, RangeError y SyntaxErrorque puedes usar con throw. Cada tipo tiene un propósito específico y usar el tipo apropiado hace que tu código sea más claro y fácil de depurar.

tipos-errores.js
Loading code...

Este ejemplo muestra cómo usar TypeError para operaciones con tipos incorrectos y RangeError para valores fuera de rango. Cada tipo de error comunica claramente qué tipo de problema ocurrió. En el siguiente artículo veremos en detalle todos los tipos de errores nativos que JavaScript proporciona y cuándo usar cada uno.

  • <strong>Error</strong>: Error genérico para casos no específicos
  • <strong>TypeError</strong>: Operaciones con tipos incorrectos
  • <strong>ReferenceError</strong>: Referencias a variables no definidas
  • <strong>RangeError</strong>: Valores numéricos fuera de rango permitido
  • <strong>SyntaxError</strong>: Errores de sintaxis en código

Lanzar Valores que No Son Objetos Error

Aunque JavaScript permite lanzar cualquier tipo de valor con throw, lanzar strings, números u otros valores que no son objetos Errores una mala práctica. Estos valores no tienen las propiedades estándar de error como name, message y stack, lo que hace debugging mucho más difícil.

lanzar-no-objetos.js
Loading code...

Este ejemplo demuestra el problema de lanzar valores que no son objetosError. Cuando lanzas un string o número, no puedes acceder a propiedades estándar como error.name, error.messageo error.stack, lo que limita seriamente tu capacidad de depurar y manejar el error apropiadamente.

Nunca lances strings o números

Lanzar strings o números con throw es una mala práctica que dificulta debugging. Siempre usa new Error("mensaje") o constructores específicos como new TypeError("mensaje") para tener acceso a todas las propiedades del objeto Error.

Re-lanzar Errores

Re-lanzar errores es una técnica común donde capturas un error en un nivel y lo relanzas para que sea manejado en un nivel superior. Esto es útil cuando necesitas agregar contexto adicional al error, loggear información de debugging o realizar limpieza antes de que el error continúe propagándose.

re-lanzar-error.js
Loading code...

Este ejemplo muestra diferentes patrones de re-lanzamiento de errores. Puedes re-lanzar el mismo error con throw error, agregar contexto adicional al error antes de re-lanzarlo, o incluso crear un nuevo error más específico que incluya información del error original.

Patrón de captura, loggeo y re-lanzamiento

Un patrón útil es capturar el error, loggear información de debugging y luego re-lanzarlo. Esto te permite tener visibilidad de errores en niveles internos mientras permites que niveles superiores manejen el error de forma apropiada para el usuario.

Throw en Condicionales

Una de las aplicaciones más comunes de throw es en condicionales para validación de datos. Cuando una función recibe parámetros que no cumplen ciertos requisitos, lanzar un error es una forma clara de comunicar que la operación no puede continuar.

throw-en-condicionales.js
Loading code...

Este ejemplo muestra cómo usar throw en diferentes escenarios de validación. Puedes validar parámetros obligatorios, tipos de datos, rangos de valores y estructuras complejas. Cada validación fallida lanza un error específico que describe exactamente qué está mal.

No uses throw para control de flujo normal

throw debe usarse solo para excepciones, no para control de flujo normal. Si estás buscando un elemento en un array, usa returncuando lo encuentres, no throw. Los errores son costosos y deben reservarse para situaciones excepcionales.

Errores Comunes al Usar throw

Al trabajar con throw, hay varios errores comunes que los desarrolladores cometen, especialmente cuando están aprendiendo. Reconocer estos patrones problemáticos te ayudará a escribir código más robusto y mantenible.

errores-comunes.js
Loading code...

Este ejemplo muestra los cuatro errores más frecuentes: lanzar errores sin uncatch cercano que cause un colapso del programa, lanzar errores genéricos sin contexto útil, lanzar strings en lugar de objetosError, y usar throw para control de flujo normal en lugar de usar return.

Siempre proporciona contexto en los errores

Un error con mensaje "Error" o "Algo salió mal" es inútil para debugging. Siempre incluye información específica sobre qué falló: qué parámetro era inválido, qué valor se recibió, qué se esperaba, etc. Esto hace que debugging sea mucho más eficiente.

Patrones de Validación con throw

Hay varios patrones comunes que utilizan throw para validar datos de forma efectiva. Estos patrones van desde validaciones simples hasta estrategias más complejas que incluyen fallbacks y errores personalizados.

patrones-validacion.js
Loading code...

Este ejemplo muestra patrones prácticos de validación: validación de entrada de función con múltiples tipos de errores, validación en cadena de operaciones, validación con fallback a valores por defecto y validación con mensajes de error específicos acumulando múltiples errores antes de lanzar la excepción.

  • <strong>Validación de entrada</strong>: Verificar parámetros al inicio de funciones
  • <strong>Validación en cadena</strong>: Validar múltiples pasos en secuencia
  • <strong>Validación con fallback</strong>: Usar valores por defecto en caso de error
  • <strong>Validación específica</strong>: Mensajes de error detallados para cada caso

Resumen: throw

Conceptos principales:

  • throw permite lanzar errores personalizados manualmente
  • Siempre lanza objetos Error para tener propiedades estándar
  • Puedes lanzar diferentes tipos: Error, TypeError, ReferenceError, etc.
  • Re-lanzar errores con throw para propagar al nivel superior
  • throw interrumpe el flujo normal buscando un catch cercano

Mejores prácticas:

  • Usa throw para validación de datos y casos excepcionales
  • Siempre lanza objetos Error con mensajes descriptivos
  • No uses throw para control de flujo normal
  • Re-lanza errores agregando contexto cuando sea necesario
  • Elige el tipo de error apropiado para cada situación