ScaleRocket/Web

Gestion des erreurs

Error boundaries, notifications toast, modèles d'erreurs des Edge Functions et stratégies de journalisation.

Vue d'ensemble

ScaleRocket gère les erreurs à plusieurs niveaux : les error boundaries React pour les plantages, les notifications toast pour les retours utilisateur, la gestion structurée des erreurs dans les Edge Functions, et la journalisation adaptée à l'environnement.

Error Boundaries

error.tsx

Next.js intercepte automatiquement les erreurs de rendu lorsque vous créez un fichier error.tsx :

// src/app/error.tsx
"use client";

export default function Error({
  error,
  reset,
}: {
  error: Error & { digest?: string };
  reset: () => void;
}) {
  return (
    <div className="flex min-h-screen flex-col items-center justify-center">
      <h2 className="text-2xl font-bold">Something went wrong</h2>
      <p className="mt-2 text-gray-500">{error.message}</p>
      <button onClick={reset} className="mt-4 rounded bg-indigo-600 px-4 py-2 text-white">
        Try again
      </button>
    </div>
  );
}

La fonction reset relance le rendu du segment, permettant la récupération sans rechargement complet de la page.

not-found.tsx

Gérez les erreurs 404 avec une page personnalisée :

// src/app/not-found.tsx
export default function NotFound() {
  return (
    <div className="flex min-h-screen flex-col items-center justify-center">
      <h2 className="text-4xl font-bold">404</h2>
      <p className="mt-2 text-gray-500">Page not found.</p>
      <a href="/" className="mt-4 text-indigo-600 hover:underline">
        Go home
      </a>
    </div>
  );
}

Notifications Toast

Pour les erreurs non fatales (appels API échoués, erreurs de validation), utilisez le système de toast au lieu des error boundaries :

import { useToast } from "@saas/ui";

const { toast } = useToast();

try {
  await updateProfile(data);
  toast({ title: "Profile updated" });
} catch (err) {
  toast({
    title: "Update failed",
    description: err instanceof Error ? err.message : "Please try again.",
    variant: "destructive",
  });
}

Cela maintient l'utilisateur sur la page actuelle tout en affichant un retour d'information.

Modèles d'erreurs des Edge Functions

Structurez les réponses des Edge Functions avec des formats d'erreur cohérents :

// supabase/functions/my-function/index.ts
try {
  const result = await processRequest(req);
  return new Response(JSON.stringify({ data: result }), {
    status: 200,
    headers: { "Content-Type": "application/json" },
  });
} catch (error) {
  return new Response(
    JSON.stringify({ error: error.message || "Internal error" }),
    { status: 500, headers: { "Content-Type": "application/json" } }
  );
}

Codes d'erreur Supabase courants

CodeSignificationGestion
23505Violation de contrainte d'unicitéAfficher un message "existe déjà"
42501Violation de politique RLSAfficher un message "non autorisé"
PGRST116Ligne non trouvéeAfficher une page 404 ou un message "non trouvé"
23503Violation de clé étrangèreAfficher un message "enregistrement lié requis"

Stratégie de journalisation

Développement

Enregistrez les erreurs avec les traces complètes pour le débogage :

if (process.env.NODE_ENV === "development") {
  console.error("Full error:", error);
  console.error("Stack:", error.stack);
}

Production

En production, évitez de divulguer des détails internes dans la console. Utilisez la journalisation structurée ou envoyez les erreurs à un service de monitoring :

if (process.env.NODE_ENV === "production") {
  // Send to error tracking service (Sentry, LogRocket, etc.)
  captureException(error);
}

N'exposez jamais les messages d'erreur bruts de la base de données, les traces de pile ou les chemins internes aux utilisateurs finaux.

Bonnes pratiques

  • Utilisez les error boundaries pour les plantages inattendus ; utilisez les toasts pour les échecs prévisibles.
  • Fournissez toujours une action de récupération (bouton de réessai, lien vers l'accueil).
  • Validez les entrées avant de faire des appels API pour réduire la fréquence des erreurs.
  • Renvoyez des messages compréhensibles par l'utilisateur ; enregistrez les détails techniques côté serveur.

Fini ? Marquez cette page comme terminée.

On this page