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.
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.
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.
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' |
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):
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:
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:
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:
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.