Skip to main content

Panoramica

Quando crei un progetto Laravel, la gestione di errori ed eccezioni è già configurata. Le personalizzazioni si effettuano nel metodo withExceptions di bootstrap/app.php.

Flusso di gestione delle eccezioni

Ecco il percorso dal momento in cui si verifica un’eccezione fino alla risposta al client.
L’oggetto $exceptions passato alla closure di withExceptions è un’istanza di Illuminate\Foundation\Configuration\Exceptions e gestisce l’exception handling dell’intera applicazione.

Configurazione del debug

L’opzione debug in config/app.php controlla il livello di dettaglio delle informazioni di errore mostrate. Di default viene usato il valore della variabile d’ambiente APP_DEBUG nel .env.
In produzione imposta sempre APP_DEBUG a false. Lasciarlo a true rischia di esporre informazioni sensibili agli utenti finali.

Report delle eccezioni

“Fare il report” di un’eccezione significa registrarla nei log o inviarla a servizi esterni come Laravel Nightwatch, Sentry o Flare. Per default viene registrata nei log seguendo la configurazione di config/logging.php.

Callback di report personalizzata

Se vuoi trattare in modo diverso il report a seconda del tipo di eccezione, passa una closure al metodo report. Laravel determina il tipo di eccezione dall’hint di tipo della closure.
Anche registrando una callback personalizzata, la registrazione nei log di default continua. Per interrompere la propagazione al default, chiama stop() o restituisci false.

Helper report()

Se vuoi solo segnalare un’eccezione senza mostrare la pagina di errore, usa l’helper report().
L’helper report() permette di registrare l’errore senza interrompere la risposta all’utente. Ottimo per la gestione delle eccezioni in job in background o operazioni non critiche.

Prevenzione dei report duplicati

Se la stessa istanza di eccezione viene passata più volte a report(), si possono creare voci duplicate nei log. Impostando dontReportDuplicates(), la stessa istanza viene registrata solo la prima volta.

Context globale del log

Per aggiungere informazioni comuni a tutti i log di eccezione usa il metodo context. Se disponibile, l’ID dell’utente corrente viene aggiunto automaticamente.

Aggiungere il metodo context() a una classe eccezione

Definendo il metodo context() sulla classe stessa dell’eccezione, puoi includere nel log informazioni di contesto specifiche di quella eccezione.

Modificare il log level

Per registrare una specifica eccezione con un particolare log level usa il metodo level.

Throttling dei report

Quando si verificano molte eccezioni, con il metodo throttle puoi controllare quante segnalare.
Per limitare al minuto usa Limit.

Rendering delle eccezioni

Il rendering è il processo che converte un’eccezione in una risposta HTTP. Per default Laravel genera automaticamente una risposta appropriata, ma puoi personalizzarla.

Callback di rendering personalizzata

Passa una closure al metodo render per convertire l’eccezione in una risposta.
Puoi sovrascrivere anche il rendering delle eccezioni built-in (come NotFoundHttpException). Se la closure non ritorna un valore, viene usato il rendering di default.

Rilevamento automatico JSON / HTML

Laravel decide automaticamente se restituire HTML o JSON in base all’header Accept della richiesta. Per personalizzare la logica di decisione usa shouldRenderJsonWhen.

Personalizzare l’intera risposta

Con il metodo respond puoi elaborare ulteriormente la risposta generata.

Classi di eccezione personalizzate

Puoi creare classi di eccezione personalizzate nella directory app/Exceptions/. Se definisci i metodi report() e render(), vengono richiamati automaticamente senza dover configurare bootstrap/app.php.

Creazione della classe di eccezione

1

Crea la classe di eccezione

2

Implementa report() e render()

Nel metodo report() puoi usare la dependency injection tramite hint di tipo. Il service container di Laravel la risolve automaticamente.

Interfaccia ShouldntReport

Per le eccezioni che non devi mai segnalare, implementa l’interfaccia ShouldntReport. Le eccezioni che la implementano non vengono mai riportate.

Sollevare eccezioni

Helper abort()

Da qualsiasi punto dell’applicazione puoi generare una risposta di errore HTTP.

abort_if() / abort_unless()

Helper per sollevare condizionalmente l’eccezione.
Utile per controlli di autorizzazione in controller e middleware. Spesso si combina con gate e policy.

Controllo globale delle eccezioni

Ignorare eccezioni specifiche

Le eccezioni da non segnalare si indicano con dontReport. La logica di rendering personalizzata continua a funzionare.
Per ignorare in base a una condizione passa una closure a dontReportWhen.
Per default Laravel ignora automaticamente alcune eccezioni: errori 404, token CSRF non valido (419), origine non corrispondente (403) ecc.

Rimettere in report le eccezioni ignorate da Laravel

Per far tornare a essere riportate le eccezioni ignorate di default usa stopIgnoring.

Pagine di errore HTTP

In Laravel puoi definire view di errore personalizzate per singolo status HTTP.

Creare view di errore personalizzate

In resources/views/errors/ crea template Blade con lo status code come nome file.
Nella view accedi ai dettagli dell’errore tramite la variabile $exception.

Pubblicare i template di errore di default

Se vuoi partire dai template di errore di Laravel per personalizzarli, ottienili con vendor:publish.

Pagine di errore di fallback

Come fallback per gli status senza una view dedicata, puoi creare 4xx.blade.php e 5xx.blade.php.
Per 404, 500 e 503 Laravel fornisce pagine di errore di default. Per personalizzarle crea i file dedicati (404.blade.php ecc.), non il fallback.

Esempio pratico: handler di eccezioni per API

Nelle applicazioni che espongono API, le eccezioni vanno sempre restituite come JSON. Ecco un esempio di gestione centralizzata degli errori API in bootstrap/app.php.

Implementare una classe base per le eccezioni API

Creando una classe base per le eccezioni di API puoi restituire risposte di errore uniformi da tutti gli endpoint.
Uso in un controller.
  • Bastano file come resources/views/errors/404.blade.php e vengono usati automaticamente
  • Con la variabile $exception accedi al dettaglio dell’errore
  • Con php artisan vendor:publish --tag=laravel-errors ottieni i template di default
  • 4xx.blade.php / 5xx.blade.php definiscono pagine di fallback
  • Imposta sempre APP_DEBUG=false per non mostrare la stack trace agli utenti
  • Integra servizi di error tracking come Sentry o Flare per centralizzare la gestione
  • Usa throttle() per evitare il flood dei log quando le eccezioni sono numerose
  • Negli endpoint API mantieni un formato di risposta di errore JSON coerente
Ultima modifica il 2 agosto 2026