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 }}