Publicado el

Manejo de errores en aplicaciones (Guía completa con ejemplos) ⚠️

manejo errores image

El manejo de errores no es un “extra”, es una parte crítica del desarrollo. Una aplicación robusta no es la que nunca falla, sino la que sabe cómo fallar correctamente.

En este artículo exploramos las principales estrategias para manejar errores en aplicaciones modernas, tanto en frontend como backend.


1. 🧯 Try / Catch

Es la forma más básica de capturar errores en tiempo de ejecución.

🧠 Concepto

Permite interceptar excepciones y evitar que la app se rompa.

🛠 Ejemplo (JavaScript)

try {
  const data = JSON.parse(response);
} catch (error) {
  console.error("Error parseando JSON:", error);
}

⚠️ Buenas prácticas

  • No abuses de try/catch
  • Captura errores específicos cuando sea posible
  • Siempre maneja el error (no lo ignores)

2. 🧩 Error Middleware (Express)

En backend, especialmente con Express, puedes centralizar el manejo de errores.

🧠 Concepto

Un middleware que captura todos los errores de la app.

🛠 Ejemplo

app.use((err, req, res, next) => {
  console.error(err.stack);

  res.status(err.status || 500).json({
    message: err.message || "Error interno del servidor",
  });
});

✅ Ventajas

  • Centralización
  • Código más limpio
  • Manejo consistente de errores

3. 🏷️ Custom Errors

Crear clases de errores personalizadas mejora la claridad y control.

🧠 Concepto

Extender la clase Error para definir errores específicos.

🛠 Ejemplo

class NotFoundError extends Error {
  constructor(message) {
    super(message);
    this.status = 404;
  }
}

// Uso
throw new NotFoundError("Usuario no encontrado");

✅ Cuándo usarlo

  • APIs complejas
  • Lógica de negocio específica
  • Manejo detallado de errores

4. 📊 Logs (console / servicios)

Registrar errores es clave para debug y monitoreo.

🧠 Concepto

Guardar información de errores para análisis posterior.

🛠 Ejemplo

console.error("Error en login:", {
  user: "user123",
  error: err.message,
});

🔧 Herramientas recomendadas

  • Sentry
  • LogRocket
  • Datadog

✅ Buenas prácticas

  • No loguear datos sensibles
  • Añadir contexto (usuario, endpoint, etc.)
  • Diferenciar niveles (info, warn, error)

5. 🎨 Fallback UI

En frontend, cuando algo falla, debes mostrar una interfaz amigable.

🧠 Concepto

Evitar pantallas en blanco y mejorar UX.

🛠 Ejemplo (React Error Boundary)

class ErrorBoundary extends React.Component {
  state = { hasError: false };

  static getDerivedStateFromError() {
    return { hasError: true };
  }

  render() {
    if (this.state.hasError) {
      return <h1>Algo salió mal 😢</h1>;
    }

    return this.props.children;
  }
}

✅ Beneficios

  • Mejor experiencia de usuario
  • Mayor resiliencia visual
  • Evita crashes visibles

6. 🔁 Retry Requests

Reintentar peticiones fallidas puede mejorar la confiabilidad.

🧠 Concepto

Volver a intentar una operación que falló (especialmente en redes).

🛠 Ejemplo

const fetchWithRetry = async (url, retries = 3) => {
  try {
    const res = await fetch(url);
    if (!res.ok) throw new Error("Error en request");
    return res.json();
  } catch (err) {
    if (retries > 0) {
      return fetchWithRetry(url, retries - 1);
    }
    throw err;
  }
};

⚠️ Buenas prácticas

  • Usar backoff exponencial
  • Evitar loops infinitos
  • No reintentar errores lógicos (solo de red)

⚖️ Estrategia completa de manejo de errores

Una app robusta combina múltiples técnicas:

Try/Catch → Custom Errors → Middleware → Logs → Fallback UI → Retry

🧠 Buenas prácticas generales

  • Nunca expongas errores internos al usuario
  • Usa mensajes claros y amigables
  • Centraliza el manejo de errores
  • Monitorea constantemente
  • Testea escenarios de fallo

🏁 Resumen

El manejo de errores es una inversión en calidad. Implementar estas estrategias te permite:

  • Detectar problemas rápidamente
  • Mejorar la experiencia del usuario
  • Construir aplicaciones más resilientes