Panoramica
Quando crei un progetto Laravel, la gestione di errori ed eccezioni è già preconfigurata. Personalizzi con il metodowithExceptions in bootstrap/app.php.
Flusso di gestione delle eccezioni
Dal momento in cui viene sollevata un’eccezione fino alla risposta al client.$exceptions è un’istanza di Illuminate\Foundation\Configuration\Exceptions che gestisce l’handler dell’applicazione.
Debug
L’opzionedebug di config/app.php controlla quanto viene mostrato.
Di default segue APP_DEBUG in .env.
Reporting delle eccezioni
Il reporting è la registrazione delle eccezioni in log o su servizi esterni come Sentry o Flare. Di default vanno nel log secondoconfig/logging.php.
Callback di report personalizzate
Per gestire in modo diverso i vari tipi di eccezione, passa una closure areport. Laravel deduce il tipo dal type hint.
stop() o restituisci false.
Helper report()
Per segnalare un’eccezione senza mostrare una pagina d’errore, usa report().
Prevenire duplicati
Se la stessa istanza viene passata più volte areport() compaiono log duplicati. Con dontReportDuplicates() viene registrata solo la prima volta.
Contesto globale del log
Per aggiungere informazioni comuni a tutti i log di eccezioni usacontext.
L’ID utente corrente viene aggiunto automaticamente se disponibile.
Metodo context() sulla classe eccezione
Definendo context() sulla classe eccezione includi informazioni specifiche di quella eccezione.
Livello di log
Per registrare certe eccezioni a un livello specifico usalevel.
Throttling delle segnalazioni
In caso di molte eccezioni puoi limitare le segnalazioni conthrottle.
Limit.
Rendering delle eccezioni
Il rendering trasforma l’eccezione in una risposta HTTP. Laravel lo fa in automatico, ma puoi personalizzare.Callback di rendering personalizzate
Con una closure passata arender trasformi l’eccezione in risposta.
NotFoundHttpException).
Se la closure non ritorna nulla, viene usato il rendering di default.
JSON o HTML in automatico
Laravel decide in base all’headerAccept. Per personalizzare la logica usa shouldRenderJsonWhen.
Manipolare la risposta finale
Conrespond modifichi la risposta generata.
Classi eccezione personalizzate
Puoi creare eccezioni personalizzate inapp/Exceptions/.
Se definisci report() e render() vengono chiamati automaticamente senza dover configurare bootstrap/app.php.
Creare la classe eccezione
1
Crea la classe
2
Implementa report() e render()
In
report() puoi usare la dependency injection tramite type hint. Il service container risolve automaticamente.Interfaccia ShouldntReport
Per eccezioni che non vanno mai segnalate implementa ShouldntReport.
Lanciare eccezioni
Helper abort()
Ovunque nell’applicazione puoi generare una risposta di errore HTTP.
abort_if() / abort_unless()
Helper per lanciare eccezioni condizionali.
Controllo globale delle eccezioni
Ignorare eccezioni
Escludi eccezioni dal reporting condontReport. La logica di rendering personalizzata continua a funzionare.
dontReportWhen.
Laravel ignora già di default alcune eccezioni (404, CSRF 419, mismatch origin 403, ecc.).
Riportare eccezioni ignorate
ConstopIgnoring riporti eccezioni ignorate.
Pagine di errore HTTP
Puoi definire viste personalizzate per ogni codice HTTP.Creare viste di errore
Crea inresources/views/errors/ template Blade con il codice HTTP come nome.
$exception.
Pubblicare i template di default
Per personalizzarli usavendor:publish.
Pagine di fallback
Crea4xx.blade.php e 5xx.blade.php per fare da fallback.
Esempio pratico: handler API
Nelle applicazioni API le eccezioni vanno restituite sempre in JSON. Esempio inbootstrap/app.php.
Eccezione API personalizzata
Riepilogo
Report delle eccezioni
Report delle eccezioni
Rendering delle eccezioni
Rendering delle eccezioni
Pagine di errore
Pagine di errore
- Crea
resources/views/errors/404.blade.phpecc. per attivarle - Usa
$exceptionper i dettagli vendor:publish --tag=laravel-errorsper i template di default4xx.blade.php/5xx.blade.phpcome fallback
Best practice in produzione
Best practice in produzione
APP_DEBUG=falsesempre, per non esporre lo stack trace- Integra Sentry, Flare o strumenti simili
throttle()per non intasare i log- Mantieni un formato JSON coerente per gli errori delle API