Panoramica
Quando crei un progetto Laravel, la gestione di errori ed eccezioni è già configurata. Le personalizzazioni si effettuano nel metodowithExceptions 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.$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’opzionedebug 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.
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 diconfig/logging.php.
Callback di report personalizzata
Se vuoi trattare in modo diverso il report a seconda del tipo di eccezione, passa una closure al metodoreport.
Laravel determina il tipo di eccezione dall’hint di tipo della closure.
stop() o restituisci false.
Helper report()
Se vuoi solo segnalare un’eccezione senza mostrare la pagina di errore, usa l’helper report().
Prevenzione dei report duplicati
Se la stessa istanza di eccezione viene passata più volte areport(), 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 metodocontext.
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 metodolevel.
Throttling dei report
Quando si verificano molte eccezioni, con il metodothrottle puoi controllare quante segnalare.
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 metodorender per convertire l’eccezione in una risposta.
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’headerAccept della richiesta.
Per personalizzare la logica di decisione usa shouldRenderJsonWhen.
Personalizzare l’intera risposta
Con il metodorespond puoi elaborare ulteriormente la risposta generata.
Classi di eccezione personalizzate
Puoi creare classi di eccezione personalizzate nella directoryapp/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.
Controllo globale delle eccezioni
Ignorare eccezioni specifiche
Le eccezioni da non segnalare si indicano condontReport. La logica di rendering personalizzata continua a funzionare.
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 usastopIgnoring.
Pagine di errore HTTP
In Laravel puoi definire view di errore personalizzate per singolo status HTTP.Creare view di errore personalizzate
Inresources/views/errors/ crea template Blade con lo status code come nome file.
$exception.
Pubblicare i template di errore di default
Se vuoi partire dai template di errore di Laravel per personalizzarli, ottienili convendor:publish.
Pagine di errore di fallback
Come fallback per gli status senza una view dedicata, puoi creare4xx.blade.php e 5xx.blade.php.
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 inbootstrap/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.Riepilogo
Riepilogo del report delle eccezioni
Riepilogo del report delle eccezioni
Riepilogo del rendering delle eccezioni
Riepilogo del rendering delle eccezioni
Riepilogo delle pagine di errore HTTP
Riepilogo delle pagine di errore HTTP
- Bastano file come
resources/views/errors/404.blade.phpe vengono usati automaticamente - Con la variabile
$exceptionaccedi al dettaglio dell’errore - Con
php artisan vendor:publish --tag=laravel-errorsottieni i template di default 4xx.blade.php/5xx.blade.phpdefiniscono pagine di fallback
Best practice in produzione
Best practice in produzione
- Imposta sempre
APP_DEBUG=falseper 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