Introductie
Laravel biedt flexibele exception handling via twee benaderingen: het co-loceren van gedrag op exception-classes of het centraliseren ervan in bootstrap/app.php. Beide benaderingen werken, de sleutel is er één kiezen en die consistent toepassen. Daarnaast biedt Laravel tools om ruis te onderdrukken (throttling, deduplicatie), correcte API-foutformaten af te dwingen en gestructureerde context aan exceptions te koppelen.
Waarom
- Consistente afhandeling: Het kiezen van één benadering (co-located of gecentraliseerd) voorkomt verspreid, moeilijk te vinden exception-gedrag
- Minder ruis: Het throttlen van exceptions met een hoog volume en het dedupliceren van reports beschermt log sinks en budgetten voor error tracking
- Correcte API-responses: Het expliciet declareren van JSON-rendering voor API-routes voorkomt dat HTML-foutpagina's naar API-clients worden gestuurd
- Beter debuggen: Gestructureerde context op exception-classes levert rijke metadata in logregels op zonder handmatige logging
Geschikt voor
- Applicaties met custom exception-typen
- API's die consistente JSON-foutresponses nodig hebben
- Applicaties die integreren met error tracking-services (Sentry, Flare, Bugsnag)
- Applicaties met veel verkeer waar het aantal errors de logging kan overweldigen
Minder geschikt voor
- Eenvoudige applicaties waar de standaard exception handling voldoende is
- Prototypes in een vroeg stadium waar gestructureerde error handling overhead toevoegt
Voorbeelden
Kies één benadering en wees consistent
Co-locatie op de exception-class, houdt gedrag naast de definitie:
class InvalidOrderException extends Exception
{
public function report(): void { /* custom reporting */ }
public function render(Request $request): Response
{
return response()->view('errors.invalid-order', status: 422);
}
}
Gecentraliseerd in bootstrap/app.php, alle exception handling op één plek:
->withExceptions(function (Exceptions $exceptions) {
$exceptions->render(function (InvalidOrderException $e, Request $request) {
return response()->view('errors.invalid-order', status: 422);
});
})
Bekijk de bestaande codebase en volg het patroon dat al is vastgelegd.
Gebruik ShouldntReport voor exceptions die nooit gelogd mogen worden
class PodcastProcessingException extends Exception implements ShouldntReport {}
Forceer JSON-foutrendering voor API-routes
Laravel detecteert Accept: application/json automatisch, maar API-clients stellen deze mogelijk niet in:
$exceptions->shouldRenderJsonWhen(function (Request $request, Throwable $e) {
return $request->is('api/*') || $request->expectsJson();
});
Voeg gestructureerde context toe aan exceptions
class InvalidOrderException extends Exception
{
public function context(): array
{
return ['order_id' => $this->orderId];
}
}
Laravel neemt deze data automatisch op in de logregel.
Throttle exceptions met een hoog volume
Eén falende integratie kan error tracking overspoelen. Gebruik throttle() om per exception-type te rate-limiten.
Schakel dontReportDuplicates() in
Voorkomt dat dezelfde exception-instantie meerdere keren wordt gelogd wanneer report($e) in meerdere catch-blocks wordt aangeroepen.