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