Skip to content

Manejo de errores

Como manejar los errores, aquí tenemos un ejemplo básico, no está mal, pero hay formas mejores de gestionar los errores.

const validateUser = ({name, age, email} = {}) => {
if(!name) = throw new Error ('Name is required')
if(!age) = throw new Error ('Age is required')
if(!email) = throw new Error ('Email is required')
}

Esa forma no está mal del todo, pero vamos a ver una forma de manejar los errores como pros.

  • Primero, creamos una clase para manejar los errores

Extendemos de la clase Error que ya existe. Nota: super hace referencia al message de la clase extendida (Error)

class ValidationError extends Error {
constructor(message) {
super(message);
this.name("ValidationError"); // Podemos cambiar el nombre del error
}
}
const validateUser = ({name, age, email} = {}) => {
// De esta forma, sabemos por el nombre de la clase que es un error de validación y no un Error genérico
if(!name) = throw new ValidationError ('Name is required')
if(!age) = throw new ValidationError ('Age is required')
if(!email) = throw new ValidationError ('Email is required')
}

Esto nos permite tener diferentes tipos de errores y manejarlos como en el siguiente ejmplo:

  • Podemos actuar de diferentes formas dependiendo del error que tengamos
  • Nuestro código es más fácil de entender y mantener
  • Tenemos más información con solo ver el código
class ValidationError extends Error {
constructor(message) {
super(message);
this.name("ValidationError");
}
}
class ConnectionError extends Error {
constructor(message) {
super(message);
this.name("ConectionError");
}
}
const validateUser = ({name, age, email} = {}) => {
// De esta forma, sabemos por el nombre de la clase que es un error de validación y no un Error genérico
if(!name) = throw new ValidationError ('Name is required')
if(!age) = throw new ValidationError ('Age is required')
if(!email) = throw new ValidationError ('Email is required')
}
try {
validateUser({name, age, email})
} catch(e) {
if(e.name === 'ConnectionError') {
// Podemos por ejemplo intentar conectar otra vez a la BBDD
}
if(e.name === 'ValidateError') {
// Podemos sacar un modal para notificar al usuario el error
}
}

Al usar console.log o console.error podemos generar un agujero de seguridad ya que estamos dando señales del error.

try {
} catch (e) {
// NUNCA USAR console.log O console.error
// Enviar traza original a un servicio NUESTRO
}
import { ValidationError, ConnectionError } from "./errors.js";
try {
validateUser({ name, age, email });
} catch (e) {
if (e instanceof ConnectionError) {
// Podemos por ejemplo intentar conectar otra vez a la BBDD
}
if (e instanceof ValidationError) {
// Podemos sacar un modal para notificar al usuario el error
}
}