Slik håndterer du feil og unntak i Yii Framework

Hva du skal skape

Introduksjon

I dagens veiledning vil jeg introdusere Yiis feil- og unntakshåndtering og veilede deg gjennom noen innledende scenarier. 

Lurer du på hva Yii er? Se vår Introduksjon til Yii Framework og Programmering med Yii2-serien.

Hva er forskjellen mellom feil og unntak? 

Feil er uventede feil i vår kode oppdaget først av brukere. De vil vanligvis bryte programkjøp. Det er viktig ikke bare å bryte grasiøst for brukeren, men for å informere utvikleren av problemet slik at det kan løses.

Unntak opprettes av utvikleren når det oppstår en potensielt forutsigbar feiltilstand. I kode der et unntak kan oppstå, kan utvikleren kaste () et unntak til en robust feilbehandler.

Hvordan styrer du disse?

I Yii blir ikke-dødelige PHP-feil (for eksempel advarsler og merknader) rutet inn i fangbare unntak, slik at du kan bestemme hvordan du skal reagere og svare på dem. Du kan utpeke en kontrollerhandling for å behandle alle disse unntakene. Og du kan tilpasse visningsformatet for feil, f.eks. HTML, JSON, XML, etc.

Unntak og fatale PHP-feil kan bare vurderes i feilsøkingsmodus. I slike utviklingsscenarier kan Yii vise detaljert anropsstabelinformasjon og segmenter av kildekoden (du kan se dette over i tittelbildet).

Fatal feil er den type hendelser som bryter applikasjonens utførelse. Disse inkluderer ikke minne, instantiere et objekt av en klasse som ikke eksisterer, eller ringe en funksjon som ikke eksisterer. 

For eksempel:

$ t = new Unknownobject ();

La oss komme i gang med noen eksempler på feil og unntakshåndtering.

Konfigurere feil og unntakshåndtering

Først konfigurerer vi vårt program i frontend / config / main.php. ErrorHandler er definert som en komponent, som vist nedenfor. Dette eksemplet er fra min oppstartsserie-applikasjon, møteplanlegger. Legg merke til Errorhandler konfigurasjon i komponenter:

 'mp-frontend', 'name' => 'Meeting Planner', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['logg', '\ common \ components \ SiteHelper'], 'controllerNamespace' = ' > 'frontend \ controllers', 'catchAll' => [], 'komponenter' => ['assetManager' => [...], ... 'errorHandler' => ['errorAction' => 'side / feil', 'maxSourceLines '=> 20,], ...],]; 

I eksemplet ovenfor, errorAction leder brukeren til min SiteController feilhandling. 

I bredere grad tilbyr Yii en rekke konfigurasjonsalternativer for Errorhandler for omdirigering og datainnsamling:

Eiendom Type Beskrivelse
$ callStackItemView string Banen til visningsfilen for gjengivelse av unntak og feiloppringingsstabelelement. f.eks '@ Yii / visninger / Errorhandler / callStackItem.php'
$ displayVars matrise Liste over de forhåndsdefinerte PHP-variablene som skal vises på feilsiden. f.eks ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION']
$ errorAction string Ruten (f.eks. site / feil) til kontrolleren handling som vil bli brukt til å vise eksterne feil.
$ errorView string Banen til visningsfilen for å gjengi unntak uten informasjon om anropsstabel. f.eks '@ Yii / visninger / Errorhandler / error.php'
$ exceptionView string Banen til visningsfilen for å gjengi unntak. f.eks '@ Yii / visninger / Errorhandler / exception.php'
$ maxSourceLines heltall Maksimalt antall kildekoden linjer som skal vises.
$ maxTraceSourceLines heltall Maksimalt antall sporkodelinjer som skal vises.
$ previousExceptionView string Banen til visningsfilen for å gjengi tidligere unntak. f.eks '@ Yii / visninger / Errorhandler / previousException.php'

Bruke errorActions til Direct Execution

Vanligvis når en bruker møter en alvorlig feil, vil vi omdirigere dem til en vennlig, beskrivende feilside.

Det er det som errorAction i Errorhandler gjør. Det omdirigerer til SiteController's actionError:

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

I vår SiteController definerer vi en eksplisitt feil handling:

namespace app \ controllers; bruk yii; bruk yii \ web \ Controller; klasse SiteController utvider Controller public function actions () return ['error' => ['class' => 'yii \ web \ ErrorAction',],]; 

Her er en grunnleggende feilhåndterer (du kan lese mer om disse her):

offentlig funksjon actionError () $ exception = Yii :: $ app-> errorHandler-> unntak; hvis ($ unntak! == null) return $ this-> render ('error', ['unntak' => $ unntak)); 

Du kan også svare annerledes på om det oppstår en feil eller om forespørselen om side ikke finnes i søknaden din:

offentlig funksjon actionError () $ exception = Yii :: $ app-> errorHandler-> unntak; hvis ($ unntak instanceof \ yii \ web \ NotFoundHttpException) // alle ikke eksisterende kontrollører + handlinger vil ende opp her returnere $ this-> render ('pnf'); // side ikke funnet annet return $ this-> render ('error', ['exception' => $ unntak)); 

Her er min nåværende Page Not Found 404 feilhåndterer:

Du kan teoretisk inkludere et nettstedskart over koblinger, foreslåtte sider som ligner på sidebeskrivelsen, en søkefunksjon og en kontaktstøtteforbindelse på feilsidene dine. Alle disse kan hjelpe brukeren til å gjenopprette og fortsette grasiøst.

Her er min nåværende generelle feilside (åpenbart har jeg funksjoner å legge til):

Fangende unntak

Hvis vi vil overvåke en del kode for problemer, kan vi bruke en PHP-prøveavhentningsblokk. Nedenfor vil vi eksperimentere ved å utløse en dødelig splittelse med nullfeil: 

bruk yii; bruk yii \ base \ ErrorException; ... prøv 10/0;  catch (ErrorException $ e) Yii :: advarsel ("Division by zero.");  ... 

De å fange Svaret ovenfor er å generere en advarsel for loggen. Yii har omfattende logging:

  • Yii :: trace (): logg en melding for å spore hvordan et stykke kode kjører. Primært for utvikling.
  • Yii :: info (): logg en melding som formidler informasjon om hendelsen.
  • Yii :: advarsel (): logg en advarselsmelding om at det oppstod en uventet hendelse
  • Yii :: error (): logg en dødelig feil for undersøkelse

Hvis du i stedet for å logge en hendelse ønsker å rette brukeren til feilsiden vi konfigurert tidligere, kan du kaste et unntak med hendelsen:

bruk yii \ web \ NotFoundHttpException; kaste ny NotFoundHttpException ();

Her er et eksempel hvor vi kaster et unntak med en bestemt HTTP-statuskode og tilpasset melding:

 prøv 10/0;  Fangst (ErrorException $ e) kaste nytt \ yii \ web \ HttpException (451, 'Tom McFarlin \' s humor er ofte tapt på meg (og mange mennesker). '); 

Slik ser denne koden ut til brukeren:

Om Yii Logging

Alle feil i Yii logges avhengig av hvordan du har konfigurert dem. Du kan også være interessert i min veiledning om Sentry og Rollbar for å logge inn i Yii:

  • Bygg opp oppstart: Feilsøking

    Å finne produksjonsfeil kan være vanskelig uten riktig feilbehandling eller en skybasert loggingservice. Jeg prøvde to. Følg med og lær hvordan du logger ...
    Jeff Reifman
    Yii

I Avslutning

Jeg håper du likte vår utforskning av feil og unntakshåndtering. Se etter kommende opplæringsprogrammer i Programmering med Yii2-serien når vi fortsetter å dykke inn i ulike aspekter av rammen.

Hvis du vil se et dypere dykk i Yii applikasjonsutvikling, kan du se vår Bygg din oppstart med PHP-serien som bruker Yii2s avanserte mal. Den forteller historien om programmering hvert trinn i møteplanleggeren. Det er veldig nyttig hvis du vil lære om å bygge applikasjoner i Yii fra grunnen opp.

Hvis du vil vite når neste Yii2 opplæring kommer, følg meg @lookahead_io på Twitter eller sjekk min instruktørside.

Relaterte linker

  • Dokumentasjon for yii \ web \ ErrorHandler
  • Håndtering av feil (Den Definitive Guide to Yii 2.0)
  • Logging (The Definitive Guide to Yii 2.0)
  • Yii2 Developer Exchange (forfatterens ressursområde)