Skip to main content

Aperçu

Lorsque vous créez un projet Laravel, la gestion des erreurs et des exceptions est déjà configurée par défaut. La personnalisation se fait via la méthode withExceptions dans bootstrap/app.php.

Flux de traitement des exceptions

Voici le cheminement d’une exception, de son déclenchement à la réponse renvoyée au client.
L’objet $exceptions passé à la closure withExceptions est une instance de Illuminate\Foundation\Configuration\Exceptions qui pilote la gestion des exceptions dans toute l’application.

Configuration du mode debug

L’option debug de config/app.php contrôle le niveau de détail affiché pour les erreurs. Par défaut, sa valeur provient de la variable d’environnement APP_DEBUG du fichier .env.
En production, définissez impérativement APP_DEBUG sur false. Le laisser à true expose des informations sensibles à vos utilisateurs.

Signalement des exceptions

Signaler une exception, c’est l’enregistrer dans les logs ou l’envoyer à un service externe comme Laravel Nightwatch, Sentry ou Flare. Par défaut, Laravel enregistre les exceptions en s’appuyant sur la configuration de config/logging.php.

Callbacks de reporting personnalisés

Pour signaler certains types d’exceptions différemment, passez une closure à la méthode report. Laravel déduit le type d’exception depuis le type-hint de la closure.
L’enregistrement dans les logs par défaut continue de fonctionner même lorsque vous enregistrez un callback personnalisé. Pour arrêter la propagation vers la gestion par défaut, appelez stop() ou renvoyez false.

Le helper report()

Pour signaler une exception sans interrompre la réponse, utilisez le helper report().
Le helper report() permet de tracer une erreur sans interrompre la réponse à l’utilisateur. Il est particulièrement utile dans les jobs en arrière-plan ou pour des traitements non critiques.

Éviter les doublons de reporting

Si la même instance d’exception est passée plusieurs fois à report(), plusieurs entrées peuvent apparaître dans les logs. Configurez dontReportDuplicates() pour qu’une même instance ne soit journalisée que la première fois.

Contexte global de log

Pour ajouter des informations communes à tous les logs d’exception, utilisez la méthode context. L’identifiant de l’utilisateur courant est automatiquement joint lorsqu’il est disponible.

Ajouter context() à une classe d’exception

En définissant une méthode context() sur une classe d’exception, vous joignez à ses logs des informations qui lui sont propres.

Modifier le niveau de log

Pour journaliser une exception donnée à un niveau spécifique, utilisez level.

Throttling du reporting

Si un très grand nombre d’exceptions se produit, la méthode throttle permet de limiter le volume de reporting.
Pour limiter au nombre par minute, utilisez Limit.

Rendu des exceptions

Le rendu transforme une exception en réponse HTTP. Par défaut, Laravel produit une réponse appropriée ; vous pouvez néanmoins la personnaliser.

Callback de rendu personnalisé

Passez une closure à render pour convertir une exception en réponse.
Vous pouvez aussi surcharger le rendu des exceptions natives (comme NotFoundHttpException). Si la closure ne retourne rien, le rendu par défaut est utilisé.

Détection automatique JSON / HTML

Laravel décide automatiquement de renvoyer du HTML ou du JSON en s’appuyant sur l’en-tête Accept de la requête. Pour personnaliser cette logique, utilisez shouldRenderJsonWhen.

Personnaliser la réponse finale

respond permet d’agir sur la réponse déjà générée.

Classes d’exception personnalisées

Vous pouvez créer vos propres classes d’exception dans app/Exceptions/. En définissant les méthodes report() et render(), elles sont automatiquement appelées, sans configuration supplémentaire dans bootstrap/app.php.

Créer une classe d’exception

1

Générer la classe

2

Implémenter report() et render()

Vous pouvez utiliser l’injection de dépendances via un type-hint dans report() : le service container de Laravel la résoudra automatiquement.

L’interface ShouldntReport

Pour les exceptions qui ne doivent pas être signalées, implémentez l’interface ShouldntReport. Une exception implémentant cette interface n’est jamais reportée.

Lever des exceptions

Le helper abort()

Vous pouvez générer une réponse d’erreur HTTP depuis n’importe où dans l’application.

abort_if() / abort_unless()

Ce sont des helpers conditionnels pour lever une exception.
Ils sont pratiques pour les vérifications de droits dans un contrôleur ou un middleware. On les combine souvent avec des gates ou des policies.

Contrôle global des exceptions

Ignorer certaines exceptions

Utilisez dontReport pour indiquer les exceptions à ne pas signaler. La logique de rendu personnalisée reste, elle, active.
Pour ignorer sous condition, passez une closure à dontReportWhen.
Par défaut, Laravel ignore automatiquement certaines exceptions comme les erreurs 404, les erreurs de CSRF (419) ou les incohérences d’origine (403).

Réactiver le reporting d’exceptions ignorées

Pour rétablir le reporting d’exceptions ignorées par défaut, utilisez stopIgnoring.

Pages d’erreur HTTP

Laravel permet de définir une vue d’erreur personnalisée par code de statut HTTP.

Créer des vues d’erreur personnalisées

Créez, dans le répertoire resources/views/errors/, un template Blade dont le nom de fichier correspond au code de statut.
Dans la vue, la variable $exception donne accès aux informations d’erreur.

Publier les templates d’erreur par défaut

Pour partir des pages d’erreur standard de Laravel, publiez-les via vendor:publish.

Pages d’erreur de secours

Comme fallback pour les codes de statut qui n’ont pas de vue dédiée, créez 4xx.blade.php et 5xx.blade.php.
Laravel fournit des pages d’erreur par défaut pour 404, 500 et 503. Pour les personnaliser, créez le fichier dédié (par ex. 404.blade.php) plutôt que de vous appuyer sur le fallback.

Exemple concret : handler d’exceptions pour API

Une application qui expose une API doit systématiquement renvoyer du JSON. Voici un exemple de centralisation des erreurs API dans bootstrap/app.php.

Implémenter une classe d’exception API dédiée

Une classe d’exception de base dédiée à l’API permet de garantir une réponse d’erreur homogène pour tous les endpoints.
Exemple d’utilisation dans un contrôleur :

Récapitulatif

  • Créer un fichier comme resources/views/errors/404.blade.php suffit à l’activer.
  • La variable $exception donne accès au détail de l’erreur.
  • php artisan vendor:publish --tag=laravel-errors permet de récupérer les templates par défaut.
  • 4xx.blade.php / 5xx.blade.php définissent des pages de secours.
  • Toujours fixer APP_DEBUG=false pour ne pas exposer la stack trace aux utilisateurs.
  • Intégrer un service de suivi d’erreurs comme Sentry ou Flare pour centraliser les incidents.
  • Utiliser throttle() pour éviter la saturation des logs en cas de pic d’exceptions.
  • Sur une API, conserver un format JSON d’erreur cohérent pour tous les endpoints.
Dernière modification le 2 août 2026