Come gestire gli errori e le eccezioni nel framework Yii

Cosa starai creando

introduzione

Nel tutorial di oggi, presenterò l'errore e la gestione delle eccezioni di Yii e ti guiderò attraverso alcuni scenari introduttivi. 

Ti chiedi cosa sia Yii? Scopri la nostra Introduzione al framework e alla programmazione Yii con la serie Yii2.

Qual è la differenza tra errori ed eccezioni? 

Gli errori sono difetti imprevisti nel nostro codice spesso scoperti prima dagli utenti. Solitamente interrompono l'esecuzione del programma. È importante non solo rompere con grazia per l'utente, ma informare lo sviluppatore del problema in modo che possa essere corretto.

Le eccezioni vengono create dallo sviluppatore quando si verifica una condizione di errore potenzialmente prevedibile. Nel codice in cui potrebbe verificarsi un'eccezione, lo sviluppatore può lanciare () un'eccezione a un gestore di errori affidabile.

Come fa Yii a gestirli?

In Yii, gli errori PHP non fatali (ad esempio avvertimenti e notifiche) vengono instradati in eccezioni intercettabili in modo che tu possa decidere come reagire e rispondere ad essi. È possibile designare un'azione del controllore per elaborare tutte queste eccezioni. E puoi personalizzare il formato di visualizzazione degli errori, ad es. HTML, JSON, XML, ecc.

Eccezioni e errori fatali di PHP possono essere valutati solo in modalità di debug. In questi tipi di scenari di sviluppo, Yii può visualizzare informazioni dettagliate sullo stack delle chiamate e segmenti di codice sorgente (puoi vedere questo sopra nell'immagine del titolo).

Gli errori irreversibili sono il tipo di eventi che interrompono l'esecuzione dell'applicazione. Questi includono memoria insufficiente, istanziando un oggetto di una classe che non esiste o chiamando una funzione che non esiste. 

Per esempio:

$ t = new Unknownobject ();

Iniziamo con alcuni esempi di gestione degli errori e delle eccezioni.

Configurazione di gestione errori ed eccezioni

Per prima cosa configuriamo la nostra applicazione in frontend / config / main.php. ErrorHandler è definito come un componente, come mostrato di seguito. Questo esempio proviene dalla mia applicazione di serie di avvio, Meeting Planner. Notare il errorHandler configurazione in componenti:

 'mp-frontend', 'name' => 'Meeting Planner', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['log', '\ common \ components \ SiteHelper'], 'controllerNamespace' = > 'frontend \ controller', 'catchAll' => [], 'components' => ['assetManager' => [...], ... 'errorHandler' => ['errorAction' => 'site / error', 'maxSourceLines '=> 20,], ...],]; 

Nell'esempio sopra, ErrorAction indirizza l'utente all'azione di errore del mio SiteController. 

Più in generale, Yii offre una varietà di opzioni di configurazione per errorHandler per il reindirizzamento e la raccolta dei dati:

Proprietà genere Descrizione
$ callStackItemView stringa Il percorso del file di visualizzazione per il rendering di eccezioni e errori richiama l'elemento stack. per esempio. '@ Yii / views / errorHandler / callStackItem.php'
$ displayVars schieramento Elenco delle variabili predefinite di PHP che dovrebbero essere visualizzate nella pagina di errore. per esempio. ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION']
$ ErrorAction stringa La rotta (ad es. sito / errore) all'azione del controller che verrà utilizzata per visualizzare errori esterni.
$ ErrorView stringa Il percorso del file di visualizzazione per il rendering di eccezioni senza informazioni sullo stack di chiamata. per esempio. '@ Yii / views / errorHandler / error.php'
$ exceptionView stringa Il percorso del file di visualizzazione per il rendering delle eccezioni. per esempio. '@ Yii / views / errorHandler / exception.php'
$ maxSourceLines numero intero Numero massimo di linee di codice sorgente da visualizzare.
$ maxTraceSourceLines numero intero Numero massimo di linee di codice sorgente di traccia da visualizzare.
$ previousExceptionView stringa Il percorso del file di visualizzazione per il rendering delle eccezioni precedenti. per esempio. '@ Yii / views / errorHandler / previousException.php'

Usando errorActions su Direct Execution

In genere, quando un utente incontra un errore grave, vogliamo reindirli a una pagina di errore descrittiva e amichevole.

Questo è ciò che ErrorAction nel errorHandler lo fa. Reindirizza all'azione del nostro SiteError:

return ['components' => ['errorHandler' => ['errorAction' => 'site / error',],]];

Nel nostro SiteController, definiamo un esplicito errore azione:

app namespace \ controller; usare Yii; utilizzare yii \ web \ Controller; class SiteController estende Controller public function actions () return ['error' => ['class' => 'yii \ web \ ErrorAction',],]; 

Ecco un gestore di errori di base (puoi leggere ulteriori informazioni su questi qui):

funzione pubblica actionError () $ exception = Yii :: $ app-> errorHandler-> eccezione; if ($ exception! == null) return $ this-> render ('error', ['exception' => $ exception]); 

Puoi anche rispondere in modo diverso se c'è un errore o se la richiesta di pagina non esiste nella tua applicazione:

funzione pubblica actionError () $ exception = Yii :: $ app-> errorHandler-> eccezione; if ($ exception instanceof \ yii \ web \ NotFoundHttpException) // tutti i controller non esistenti + azioni finiranno qui return $ this-> render ('pnf'); // pagina non trovata else return $ this-> render ('error', ['exception' => $ exception]); 

Ecco il mio attuale gestore di errori 404 Pagina non trovata:

In teoria, potresti includere una mappa del sito di collegamenti, pagine suggerite simili alla richiesta di pagina, una funzione di ricerca e un link di supporto per i contatti nelle tue pagine di errore. Tutti questi possono aiutare l'utente a recuperare e muoversi con garbo.

Ecco la mia pagina di errore generale corrente (Ovviamente ho delle caratteristiche da aggiungere):

Cattura le eccezioni

Se vogliamo monitorare una sezione di codice per problemi, possiamo usare un blocco catch di PHP. Di seguito, sperimenteremo attivando una divisione fatale per errore zero: 

usare Yii; usa yii \ base \ ErrorException; ... prova 10/0;  catch (ErrorException $ e) Yii :: warning ("Divisione per zero.");  ... 

Il catturare risposta sopra è di generare un avviso per il registro. Yii ha un ampio log:

  • Yii :: trace (): registra un messaggio per tracciare come viene eseguito un pezzo di codice. Principalmente per lo sviluppo.
  • Yii :: info (): registra un messaggio che trasmette informazioni sull'evento.
  • Yii :: warning (): registra un messaggio di avviso che si è verificato un evento imprevisto
  • Yii :: error (): registra un errore fatale per l'analisi

Se, invece di registrare un evento, desideri indirizzare l'utente alla pagina di errore che abbiamo configurato in precedenza, puoi generare un'eccezione con l'evento:

utilizzare yii \ web \ NotFoundHttpException; lanciare la nuova NotFoundHttpException ();

Ecco un esempio in cui viene generata un'eccezione con uno specifico codice di stato HTTP e un messaggio personalizzato:

 prova 10/0;  catch (ErrorException $ e) throw new \ yii \ web \ HttpException (451, l'umorismo di Tom McFarlin è spesso perso su di me (e molte persone). '); 

Ecco come appare il codice per l'utente:

Informazioni su Yii Logging

Tutti gli errori in Yii vengono registrati in base a come li hai impostati. Potresti anche essere interessato al mio tutorial su Sentry e Rollbar per l'accesso a Yii:

  • Costruisci la tua startup: Error Logging

    Trovare errori di produzione può essere difficile senza una corretta gestione degli errori o un servizio di registrazione basato su cloud. Ho provato due. Segui e scopri come registrare ...
    Jeff Reifman
    Yii

In chiusura

Spero ti sia piaciuta la nostra esplorazione dell'errore e della gestione delle eccezioni. Guarda le prossime esercitazioni nella nostra serie Programming With Yii2 mentre continuiamo a esplorare i diversi aspetti del framework.

Se desideri vedere un tuffo più profondo nello sviluppo di applicazioni Yii, consulta la nostra serie Building Your Startup with PHP che utilizza il modello avanzato di Yii2. Racconta la storia della programmazione di ogni fase di Meeting Planner. È molto utile se vuoi imparare a costruire applicazioni in Yii da zero.

Se vuoi sapere quando arriverà il prossimo tutorial di Yii2, seguimi su @lookahead_io su Twitter o controlla la mia pagina di istruttore.

Link correlati

  • Documentazione per yii \ web \ ErrorHandler
  • Errori di gestione (The Definitive Guide to Yii 2.0)
  • Registrazione (The Definitive Guide to Yii 2.0)
  • Yii2 Developer Exchange (sito di risorse dell'autore)