Manejo de Errores
Páginas de error personalizadas y notificaciones con toast
Manejo de Errores
EmpiezaTuSaaS incluye manejo de errores completo: páginas de error personalizadas, notificaciones toast y patrones try-catch en las API routes.
Páginas de error
Error global (error.tsx)
Next.js captura automáticamente los errores no controlados y muestra app/error.tsx. Este componente recibe el error y una funcion reset() para reintentar.
"use client";
export default function Error({
error,
reset,
}: {
error: Error & { digest?: string };
reset: () => void;
}) {
return (
<div className="min-h-screen flex items-center justify-center">
<div className="text-center">
<h2 className="text-2xl font-bold mb-4">Algo salio mal</h2>
<p className="text-muted-foreground mb-6">{error.message}</p>
<button onClick={reset}>Reintentar</button>
</div>
</div>
);
}error.tsx debe ser un Client Component ("use client"). Es un requisito de Next.js.
Página 404 (not-found.tsx)
Cuando un usuario visita una ruta que no existe, Next.js renderiza app/not-found.tsx:
export default function NotFound() {
return (
<div className="min-h-screen flex items-center justify-center">
<div className="text-center">
<h1 className="text-6xl font-bold">404</h1>
<p className="text-muted-foreground mt-4">Página no encontrada</p>
<a href="/" className="text-primary mt-6 inline-block">
Volver al inicio
</a>
</div>
</div>
);
}Notificaciones Toast
El boilerplate usa Sonner para notificaciones toast. Ya está configurado en el layout principal.
Uso básico
import { toast } from "sonner";
// Exito
toast.success("Pago procesado correctamente");
// Error
toast.error("No se pudo procesar el pago");
// Promesa (loading -> success/error)
toast.promise(fetchData(), {
loading: "Cargando...",
success: "Datos cargados",
error: "Error al cargar datos",
});Configuración
Sonner ya está incluido en app/layout.tsx con el componente <Toaster />:
import { Toaster } from "sonner";
export default function RootLayout({ children }) {
return (
<html>
<body>
{children}
<Toaster richColors position="bottom-right" />
</body>
</html>
);
}Try-catch en API Routes
Todas las API routes siguen el patron try-catch con respuestas JSON estandarizadas:
import { NextResponse } from "next/server";
export async function POST(req: Request) {
try {
const body = await req.json();
// Tu lógica aqui...
return NextResponse.json({ success: true, data: result });
} catch (error) {
console.error("Error en /api/ejemplo:", error);
return NextResponse.json(
{ error: "Error interno del servidor" },
{ status: 500 }
);
}
}Nunca expongas el mensaje de error real al cliente en producción. Usa mensajes genericos y loguea el error real en el servidor.
Personalizacion
- Cambiar estilo de la página 404: Edita
app/not-found.tsxcon tu diseno - Cambiar posicion del toast: Cambia
positionen<Toaster />(top-right, bottom-left, etc.) - Añadir error tracking: Integra Sentry en
error.tsxpara capturar errores en producción