Hoe om te gaan met fouten en uitzonderingen in het Yii Framework

Wat je gaat creëren

Invoering

In de tutorial van vandaag zal ik de fout- en uitzonderingsafhandeling van Yii introduceren en u enkele introductiescenario's laten zien. 

Vraagt ​​u zich af wat Yii is? Bekijk onze Introductie tot het Yii Framework en Programming With Yii2 series.

Wat is het verschil tussen fouten en uitzonderingen? 

Fouten zijn onverwachte defecten in onze code die vaak als eerste door gebruikers wordt ontdekt. Ze zullen meestal de uitvoering van het programma breken. Het is belangrijk om niet alleen elegant te breken voor de gebruiker, maar ook om de ontwikkelaar op de hoogte te stellen van het probleem, zodat dit kan worden verholpen.

Uitzonderingen worden gemaakt door de ontwikkelaar wanneer een mogelijk voorspelbare fout optreedt. In code waar een uitzondering kan optreden, kan de ontwikkelaar () een uitzondering op een robuuste fouthandler werpen.

Hoe beheert Yii deze?

In Yii worden niet-fatale PHP-fouten (bijvoorbeeld waarschuwingen en meldingen) omgeleid naar catchable exceptions, zodat u kunt beslissen hoe u moet reageren en erop kunt reageren. U kunt een controlleractie toewijzen om al deze uitzonderingen te verwerken. En u kunt het weergaveformaat aanpassen voor fouten, bijvoorbeeld HTML, JSON, XML, enz.

Uitzonderingen en fatale PHP-fouten kunnen alleen in de debug-modus worden beoordeeld. In dit soort ontwikkelingsscenario's kan Yii gedetailleerde informatie over de oproepstapel en segmenten van de broncode weergeven (je kunt dit hierboven zien in de titelafbeelding).

Fatale fouten zijn het soort gebeurtenissen dat de uitvoering van de toepassing schendt. Deze omvatten een gebrek aan geheugen, het instantiëren van een object van een klasse dat niet bestaat, of het aanroepen van een functie die niet bestaat. 

Bijvoorbeeld:

$ t = new Unknownobject ();

Laten we aan de slag gaan met enkele voorbeelden van fouten- en uitzonderingsafhandeling.

Fout- en uitzonderingsafhandeling configureren

Eerst configureren we onze applicatie in frontend / config / main.php. De errorHandler wordt gedefinieerd als een component, zoals hieronder wordt getoond. Dit voorbeeld is afkomstig uit mijn opstartreeksapplicatie, Meeting Planner. Let op de errorHandler configuratie in componenten:

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

In het bovenstaande voorbeeld, errorAction leidt de gebruiker naar de foutactie van mijn SiteController. 

Meer in het algemeen biedt Yii een verscheidenheid aan configuratie-opties voor errorHandler voor omleiding en gegevensverzameling:

Eigendom Type Omschrijving
$ callStackItemView draad Het pad van het weergavebestand voor rendering-uitzonderingen en fouten-call stack-element. bijv. '@ Yii / views / errorHandler / callStackItem.php'
$ displayVars rangschikking Lijst met vooraf gedefinieerde PHP-variabelen die op de foutpagina moeten worden weergegeven. bijv. ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION']
$ errorAction draad De route (bijv. site / error) naar de controlleractie die zal worden gebruikt om externe fouten weer te geven.
$ errorView draad Het pad van het weergavebestand voor weergaveuitzonderingen zonder informatie over de call stack. bijv. '@ Yii / views / errorHandler / error.php'
$ exceptionView draad Het pad van het weergavebestand voor weergave-uitzonderingen. bijv. '@ Yii / views / errorHandler / exception.php'
$ maxSourceLines geheel getal Maximumaantal broncodelijnen dat moet worden weergegeven.
$ maxTraceSourceLines geheel getal Maximumaantal traceerbronregelregels dat moet worden weergegeven.
$ previousExceptionView draad Het pad van het weergavebestand voor het weergeven van eerdere uitzonderingen. bijv. '@ Yii / views / errorHandler / previousException.php'

ErrorActions gebruiken voor directe uitvoering

Over het algemeen willen we dat wanneer een gebruiker een ernstige fout tegenkomt, deze wordt omgeleid naar een vriendelijke, beschrijvende foutpagina.

Dat is wat de errorAction in errorHandler doet. Het wordt omgeleid naar onze actie ActionControllerFout:

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

In onze SiteController definiëren we een expliciete fout actie:

naamruimte app \ controllers; gebruik Yii; gebruik yii \ web \ Controller; class SiteController breidt Controller uit public function actions () return ['error' => ['class' => 'yii \ web \ ErrorAction',],]; 

Hier is een basisfoutafhandelaar (u kunt hier meer over lezen):

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

U kunt ook anders reageren als er een fout is of als de pagina-aanvraag niet bestaat in uw toepassing:

public function actionError () $ exception = Yii :: $ app-> errorHandler-> exception; if ($ exception instanceof \ yii \ web \ NotFoundHttpException) // alle niet-bestaande controllers + acties zullen hier eindigen, geef $ this-> render ('pnf'); // pagina niet gevonden anders return $ this-> render ('error', ['exception' => $ exception]); 

Dit is mijn huidige pagina niet gevonden 404-fout handler:

In theorie zou u een sitemap van links, voorgestelde pagina's vergelijkbaar met het paginaverzoek, een zoekfunctie en een contactondersteuningslink op uw foutpagina's kunnen opnemen. Al deze kunnen de gebruiker helpen herstellen en elegant verder gaan.

Dit is mijn huidige algemene foutpagina (uiteraard heb ik functies om toe te voegen):

Uitzonderingen vangen

Als we een deel van de code willen controleren op problemen, kunnen we een PHP try catch-blok gebruiken. Hieronder zullen we experimenteren door een fatale kloof te triggeren met een fout nul: 

gebruik Yii; gebruik yii \ base \ ErrorException; ... probeer 10/0;  catch (ErrorException $ e) Yii :: warning ("Division by zero.");  ... 

De vangst bovenstaande reactie is om een ​​waarschuwing voor het logboek te genereren. Yii heeft uitgebreide logboeken:

  • Yii :: trace (): log een bericht om te achterhalen hoe een stuk code wordt uitgevoerd. In de eerste plaats voor ontwikkeling.
  • Yii :: info (): log een bericht in met informatie over het evenement.
  • Yii :: warning (): log een waarschuwingsbericht dat er zich een onverwachte gebeurtenis heeft voorgedaan
  • Yii :: error (): log een fatale fout in voor onderzoek

Als u in plaats van een gebeurtenis te loggen de gebruiker naar de foutpagina wilt sturen die we eerder hebben geconfigureerd, kunt u een uitzondering met de gebeurtenis genereren:

gebruik yii \ web \ NotFoundHttpException; gooi nieuwe NotFoundHttpException ();

Hier is een voorbeeld waarbij we een uitzondering toewerpen met een specifieke HTTP-statuscode en een aangepast bericht:

 probeer 10/0;  catch (ErrorException $ e) throw new \ yii \ web \ HttpException (451, 'Tom McFarlin's humor is vaak verloren aan mij (en veel mensen).'); 

Zo ziet die code eruit voor de gebruiker:

Over Yii Logging

Alle fouten in Yii worden vastgelegd, afhankelijk van hoe je ze hebt ingesteld. Mogelijk bent u ook geïnteresseerd in mijn tutorial over Sentry en Rollbar voor het inloggen in Yii:

  • Uw start opstarten: foutenregistratie

    Het vinden van productiefouten kan moeilijk zijn zonder een juiste foutafhandeling of een cloudgebaseerde logging-service. Ik heb er twee geprobeerd. Volg mee en leer hoe loggen ...
    Jeff Reifman
    Yii

In Closing

Ik hoop dat je genoten hebt van onze verkenning van fouten en afhandeling van uitzonderingen. Bekijk de komende tutorials in onze Programming With Yii2-serie terwijl we doorgaan met duiken in verschillende aspecten van het framework.

Als je een diepere duik wilt zien in de ontwikkeling van de Yii-applicatie, bekijk dan onze Building Your Startup With PHP-serie die de geavanceerde template van Yii2 gebruikt. Het vertelt het verhaal van het programmeren van elke stap van Meeting Planner. Het is erg handig als je vanaf de basis wilt leren over het bouwen van applicaties in Yii.

Als je wilt weten wanneer de volgende Yii2-tutorial aankomt, volg me dan @lookahead_io op Twitter of bekijk mijn instructeurpagina.

Gerelateerde Links

  • Documentatie voor yii \ web \ ErrorHandler
  • Handelingsfouten (de definitieve gids voor Yii 2.0)
  • Logging (de definitieve gids voor Yii 2.0)
  • Yii2 Developer Exchange (bronnenpagina van de auteur)