Cómo lanzar y capturar errores en JavaScript con throw y try catch.
Conocer cómo tratar los errores en JavaScript es fundamental. El lenguaje nos ofrece mecanismos concretos que nos permiten gestionar errores de la aplicación. A continuación veremos cómo.
Hay errores que son controlables y otros que pueden rompernos la aplicación si no los gestionamos. También es importante registrar información cuando ocurre un error para depurarlo posteriormente. O incluso para mostrar al usuario información coherente de un fallo inesperado.
throw
JavaScript nos permite lanzar errores explícitamente usando la palabra clave throw
. Podemos lanzar cualquier tipo de dato, pero es más práctico lanzar instancias de Error
o de clases que hereden de Error
. Veamos un ejemplo.
function divide(a, b) { if (b === 0) { throw new Error('La división por 0 no está permitida'); } return a / b;}
En este caso, lanzamos un error si el divisor es cero. Este tipo de control es útil cuando queremos que quien invoque la función sepa que algo ha ido mal y decida qué hacer a continuación.
try...catch
Una vez lanzado un error, podemos capturarlo con try...catch
. Este bloque permite ejecutar un código con riesgo de error sin que el programa se detenga si ese error ocurre.
try { const result = divide(10, 0); console.log(result);} catch (err) { console.error('Something went wrong:', err.message);}
Aquí protegemos el código que podría fallar. Si divide
lanza una excepción, la ejecución no se detiene y el error se captura en el bloque catch
.
finally
El bloque opcional finally
se ejecuta siempre, tanto si se ha producido un error como si no. Suele usarse para liberar recursos, cerrar conexiones o dejar el entorno en un estado consistente.
try { // código que podría fallar} catch (err) { // gestión del error} finally { // se ejecuta siempre}
Podemos definir nuestras propias clases de error para representar fallos más específicos. Esto ayuda a categorizar errores según su naturaleza y a decidir cómo reaccionar.
class ValidationError extends Error { constructor(message) { super(message); this.name = 'ValidationError'; }}
function validateUsername(username) { if (username.length < 3) { throw new ValidationError('Username must be at least 3 characters long'); }}
Y después:
try { validateUsername('ab');} catch (err) { if (err instanceof ValidationError) { console.warn('Error de validación:', err.message); } else { throw err; }}
Este patrón permite distinguir errores que podemos tratar de aquellos que deben propagarse.
No todos los errores se pueden capturar con try...catch
. Por ejemplo:
try
.try
se haya evaluado.