Hur man hanterar fel och undantag i Yii Framework

Vad du ska skapa

Introduktion

I dagens handledning presenterar jag Yiis fel- och undantagshantering och guidar dig genom några introduktionsscenarier. 

Undrar vad Yii är? Kolla in vår Introduktion till Yii Framework och Programmering med Yii2-serien.

Vad är skillnaden mellan fel och undantag? 

Fel är oväntade defekter i vår kod som ofta upptäcks först av användarna. De brukar bryta programkörning. Det är viktigt att inte bara bryta sig för användaren utan informera utvecklaren om problemet så att det kan lösas.

Undantag skapas av utvecklaren när ett potentiellt förutsägbart felförhållande uppstår. I kod där ett undantag kan uppstå kan utvecklaren kasta () ett undantag till en robust felhanterare.

Hur hanterar ni dessa?

I Yii dirigeras icke-dödliga PHP-fel (till exempel varningar och meddelanden) i fångbara undantag så att du kan bestämma hur du ska reagera och svara på dem. Du kan ange en kontrolleråtgärd för att behandla alla dessa undantag. Och du kan anpassa visningsformatet för fel, t.ex. HTML, JSON, XML, etc..

Undantag och dödliga PHP-fel kan endast bedömas i debug-läge. I dessa typer av utvecklingsscenarier kan Yii visa detaljerad samtalsstapinformation och segment av källkod (du kan se detta ovan i titelbilden).

Felaktiga fel är den typ av händelser som bryter programkörningen. Dessa inkluderar inte minne, instantiating ett objekt av en klass som inte existerar, eller ringa en funktion som inte existerar. 

Till exempel:

$ t = nytt Unknownobject ();

Låt oss börja med några exempel på fel- och undantagshantering.

Konfigurera fel och undantagshantering

Först konfigurerar vi vår applikation i frontend / config / main.php. ErrorHandler definieras som en komponent, som visas nedan. Detta exempel är från min startprogramserie, mötesplanerare. Lägg märke till errorhandler konfiguration i komponenter:

 'mp-frontend', 'name' => 'Mötesplanerare', 'basePath' => namnnamn (__ DIR__), 'bootstrap' => ['logg', '\ common \ components \ SiteHelper'], 'controllerNamespace' = ' > 'frontend \ controllers', 'catchAll' => [], 'komponenter' => ['assetManager' => [...], ... 'errorHandler' => ['errorAction' => 'plats / fel', 'maxSourceLines '=> 20,], ...],]; 

I ovanstående exempel, errorAction riktar användaren till min SiteController felaktion. 

Mer omfattande erbjuder Yii en mängd olika konfigurationsalternativ för errorhandler för omdirigering och datainsamling:

Fast egendom Typ Beskrivning
$ callStackItemView sträng Sökvägen för visningsfilen för att göra undantag och felsamtalstackelement. t.ex. '@ Yii / vyer / errorhandler / callStackItem.php'
$ displayVars array Lista över de fördefinierade PHP-variablerna som ska visas på felsidan. t.ex. ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION']
$ errorAction sträng Rutten (t.ex.. site / fel) till kontrollenhetens åtgärd som kommer att användas för att visa externa fel.
$ errorView sträng Sökvägen för visningsfilen för att göra undantag utan information om samtalstack. t.ex. '@ Yii / vyer / errorhandler / error.php'
$ exceptionView sträng Banan för visningsfilen för att göra undantag. t.ex. '@ Yii / vyer / errorhandler / exception.php'
$ maxSourceLines heltal Maximalt antal källkodslinjer som ska visas.
$ maxTraceSourceLines heltal Maximalt antal spårkodslinjer som ska visas.
$ previousExceptionView sträng Banan för visningsfilen för att göra tidigare undantag. t.ex. '@ Yii / vyer / errorhandler / previousException.php'

Använda errorActions för direkt utförande

I allmänhet, när en användare möter ett allvarligt fel vill vi omdirigera dem till en vänlig, beskrivande fel sida.

Det är vad errorAction i errorhandler gör. Det omdirigerar till vår SiteController actionError:

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

I vår SiteController definierar vi en explicit fel verkan:

namespace app \ controllers; använd Yii; använd yii \ web \ Controller; klass SiteController utökar Controller public function actions () return ['error' => ['class' => 'yii \ web \ ErrorAction',],]; 

Här är en grundläggande felhanterare (du kan läsa mer om dessa här):

allmän funktion actionError () $ exception = Yii :: $ app-> errorHandler-> exception; om ($ exception! == null) return $ this-> render ('error', ['exception' => $ undantag]); 

Du kan också svara annorlunda om det finns ett fel eller om sidförfrågan inte finns i din ansökan:

allmän funktion actionError () $ exception = Yii :: $ app-> errorHandler-> exception; om ($ exception instanceof \ yii \ web \ NotFoundHttpException) // alla icke befintliga controllers + åtgärder kommer att hamna här returnera $ this-> render ('pnf'); // sida hittades inte annat return $ this-> render ('error', ['exception' => $ undantag]); 

Här är min nuvarande sida Not Found 404-felhanterare:

Du kan teoretiskt inkludera en webbplatskarta över länkar, förslag på sidor som liknar sidförfrågan, en sökfunktion och en kontaktlänk på dina fel sidor. Alla dessa kan hjälpa användaren att återhämta sig och fortsätta graciöst.

Här är min nuvarande allmänna fel sida (självklart har jag funktioner att lägga till):

Fångande undantag

Om vi ​​vill övervaka ett avsnitt av kod för problem kan vi använda ett PHP-försök fångstblock. Nedan kommer vi att experimentera genom att utlösa en dödlig delning med nollfel: 

använd Yii; använd yii \ base \ ErrorException; ... försök 10/0;  fånga (ErrorException $ e) Yii :: warning ("Division by zero.");  ... 

De fånga svaret ovan är att generera en varning för loggen. Yii har omfattande loggning:

  • Yii :: trace (): logga ett meddelande för att spåra hur ett stycke kod körs. Primärt för utveckling.
  • Yii :: info (): logga ett meddelande som överför information om händelsen.
  • Yii :: warning (): logga ett varningsmeddelande om att en oväntad händelse inträffade
  • Yii :: error (): logga ett dödligt fel för undersökning

Om du vill, i stället för att logga in en händelse, direktera användaren till den fel sida vi konfigurerat tidigare kan du göra ett undantag med händelsen:

använd yii \ web \ NotFoundHttpException; kasta ny NotFoundHttpException ();

Här är ett exempel där vi gör ett undantag med en specifik HTTP-statuskod och anpassat meddelande:

 prova 10/0;  catch (ErrorException $ e) kasta nytt \ yii \ web \ HttpException (451, "Tom McFarlins humor är ofta borttappad på mig (och många människor)."); 

Här är vad den här koden ser ut som användaren:

Om Yii Logging

Alla fel i Yii loggas beroende på hur du har ställt in dem. Du kanske också är intresserad av min handledning om Sentry och Rollbar för att logga in i Yii:

  • Bygga din start: Error Logging

    Att hitta produktionsfel kan vara svårt utan korrekt felhantering eller en molnbaserad loggningstjänst. Jag försökte två. Följ med och lär dig hur du loggar ...
    Jeff Reifman
    Yii

I stängning

Jag hoppas att du njöt av vår undersökning av fel och undantagshantering. Titta på kommande tutorials i vår programmering med Yii2-serien när vi fortsätter att dyka in i olika aspekter av ramen.

Om du vill se ett djupare dyk i Yii applikationsutveckling, kolla in vår Bygga din start med PHP-serien som använder Yii2s avancerade mall. Det berättar historien om att programmera varje steg i mötesplaneraren. Det är mycket användbart om du vill lära dig om att bygga applikationer i Yii från grunden.

Om du vill veta när nästa Yii2 handledning kommer, följ mig @lookahead_io på Twitter eller kolla min instruktörssida.

relaterade länkar

  • Dokumentation för yii \ web \ ErrorHandler
  • Hantering av fel (den slutgiltiga guiden till Yii 2.0)
  • Logging (den slutgiltiga guiden till Yii 2.0)
  • Yii2 Developer Exchange (författarens resurs webbplats)