Cum să gestionați erorile și excepțiile din cadrul Yii

Ce veți crea

Introducere

În tutorialul de astăzi, vă voi prezenta modul de gestionare a erorilor și excepțiilor de la Yii și vă voi îndruma în câteva scenarii introductive. 

Te intrebi ce este Yii? Consultați Introducerea noastră în Cadrul Yii și programarea cu seria Yii2.

Care este diferența dintre erori și excepții? 

Erori sunt defecte neașteptate în codul nostru descoperit adesea de către utilizatori. Ei vor rupe, de obicei, executarea programului. Este important nu numai să rupă grațios pentru utilizator, ci să informeze dezvoltatorul despre problema, astfel încât să poată fi rezolvată.

Excepțiile sunt create de dezvoltator atunci când apare o condiție de eroare potențial previzibilă. În codul în care s-ar putea produce o excepție, dezvoltatorul poate arunca () o excepție de la un robot de eroare robust.

Cum le administrează pe Yii??

În Yii, erorile PHP non-fatale (de exemplu, avertismente și notificări) sunt direcționate către excepții care pot fi detectate, astfel încât să puteți decide cum să reacționați și să le răspundeți. Puteți desemna o acțiune a controlorului pentru a procesa toate aceste excepții. Și puteți personaliza formatul de afișare pentru erori, de ex. HTML, JSON, XML, etc.

Excepțiile și erorile fatale ale PHP pot fi evaluate numai în modul de depanare. În aceste tipuri de scenarii de dezvoltare, Yii poate afișa informații stack detaliate de apeluri și segmente de cod sursă (puteți vedea acest lucru mai sus în imaginea titlului).

Erorile fatale sunt genul de evenimente care încalcă executarea aplicației. Acestea includ lipsa memoriei, instanțierea unui obiect al unei clase care nu există sau chemarea unei funcții care nu există. 

De exemplu:

$ t = nou Obiect necunoscut ();

Să începem cu câteva exemple de tratare a erorilor și a excepțiilor.

Configurarea gestionării erorilor și a excepțiilor

Mai întâi, configurați aplicația noastră în frontend / config / main.php. Ergonomul de eroare este definit ca o componentă, după cum se arată mai jos. Acest exemplu este din aplicația mea de lansare în serie, Planificatorul întâlnirilor. Observați ErrorHandler configurație în componente:

 'mp-frontend', 'name' => 'Planificator de întâlniri', 'basePath' => dirname (__ DIR__), 'bootstrap' => > 'frontend \ controllers', 'catchAll' => [], 'components' => ['assetManager' => [...], ... 'errorHandler' => '=> 20,], ...],]; 

În exemplul de mai sus, errorAction direcționează utilizatorul la acțiunea de eroare a SiteController. 

În general, Yii oferă o varietate de opțiuni de configurare pentru ErrorHandler pentru redirecționare și culegere de date:

Proprietate Tip Descriere
$ callStackItemView şir Calea fișierului de vizualizare pentru excepțiile de randare și erorile elementului stack de apeluri. de exemplu. '@ Yii / opinii / ErrorHandler / callStackItem.php'
$ displayVars mulțime Lista variabilelor predefinite PHP care ar trebui afișate pe pagina de eroare. de exemplu. ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION']
$ errorAction şir Traseul (de ex. site / eroare) la acțiunea controlerului care va fi utilizată pentru afișarea erorilor externe.
$ errorView şir Calea fișierului de vizualizare pentru redarea excepțiilor fără informații despre stiva apelurilor. de exemplu. '@ Yii / opinii / ErrorHandler / error.php'
$ exceptionView şir Calea fișierului de vizualizare pentru redarea excepțiilor. de exemplu. '@ Yii / opinii / ErrorHandler / exception.php'
$ maxSourceLines întreg Numărul maxim de linii de cod sursă care trebuie afișate.
$ maxTraceSourceLines întreg Numărul maxim de linii de cod sursă care urmează să fie afișate.
$ previousExceptionView şir Calea fișierului de vizualizare pentru redarea excepțiilor anterioare. de exemplu. '@ Yii / opinii / ErrorHandler / previousException.php'

Folosind errorActions pentru executarea directă

În general, atunci când un utilizator întâlnește o eroare gravă, dorim să îi redirecționăm către o pagină eronată, descriptivă.

Asta e ceea ce errorAction în ErrorHandler face. Se redirecționează către acțiunea noastră SiteControllerError:

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

În SiteController, definim explicit eroare acțiune:

namespace app \ controllers; utilizați Yii; utilizați yii \ web \ Controller; clasa SiteController extinde controlerul public action actions () return ['error' => ['class' => 'yii \ web \ ErrorAction',];]; 

Iată un handler de eroare de bază (puteți citi mai multe despre acestea aici):

funcția publică funcțiaError () $ exception = Yii :: $ app-> errorHandler-> excepție; dacă ($ excepție! == null) return $ this-> render ('error', ['excepție' => $ excepție]); 

De asemenea, puteți răspunde diferit dacă există o eroare sau dacă cererea de pagină nu există în aplicația dvs.:

funcția publică funcțiaError () $ exception = Yii :: $ app-> errorHandler-> excepție; dacă ($ excepție instanță \ yii \ web \ NotFoundHttpException) // toți controlorii + acțiuni non-existente se vor termina aici return $ this-> render ('pnf'); // pagina nu a fost găsită altceva return $ this-> render ('error', ['exception' => $ exception]); 

Iată pagina mea curentă care nu a fost găsită 404 de eroare:

Puteți include teoretic o hartă a site-urilor de linkuri, pagini sugerate similare solicitării de pagină, o funcție de căutare și un link de asistență pentru contact pe paginile de eroare. Toate acestea pot ajuta utilizatorul să se recupereze și să se miște cu grație.

Iată pagina mea generală de eroare (evident că am caracteristici de adăugat):

Capturarea excepțiilor

Dacă vrem să monitorizăm o secțiune de cod pentru probleme, putem folosi un blocaj de captură PHP try. Mai jos, vom experimenta declanșând o diviziune fatală prin eroare zero: 

utilizați Yii; utilizați yii \ base \ ErrorException; ... încercați 10/0;  captură (ErrorException $ e) Yii :: warning ("Diviziunea prin zero");  ... 

captură Răspunsul de mai sus este generarea unui avertisment pentru jurnal. Yii are logistică extinsă:

  • Yii :: trace (): log un mesaj pentru a urmări modul în care rulează o bucată de cod. În primul rând pentru dezvoltare.
  • Yii :: info (): log un mesaj care transmite informații despre eveniment.
  • Yii :: warning (): înregistrați un mesaj de avertizare că sa produs un eveniment neașteptat
  • Yii :: eroare (): înregistrați o eroare fatală pentru investigație

Dacă, în loc să vă înregistrați un eveniment, doriți să direcționați utilizatorul către pagina de eroare pe care am configurat-o mai devreme, aveți posibilitatea să aruncați o excepție cu evenimentul:

utilizați yii \ web \ NotFoundHttpException; arunca noua NotFoundHttpException ();

Iată un exemplu în care aruncăm o excepție cu un anumit cod de stare HTTP și un mesaj personalizat:

 încercați 10/0;  catch (ErrorException $ e) arunca noua \ yii \ web \ HttpException (451, "Umorul lui Tom McFarlin este deseori pierdut pe mine (si multi oameni). 

Iată cum arată acest cod utilizatorului:

Despre logarea Yii

Toate erorile din Yii sunt înregistrate în funcție de modul în care le-ați setat. Ați putea fi, de asemenea, interesat de tutorialul meu despre Sentry și Rollbar pentru conectarea la Yii:

  • Construirea sistemului de pornire: Eroare la înregistrare

    Găsirea erorilor de producție poate fi dificilă, fără o gestionare corectă a erorilor sau cu un serviciu de înregistrare pe bază de nor. Am încercat doi. Urmați de-a lungul și aflați cum se înregistrează ...
    Jeff Reifman
    Yii

În încheiere

Sper că v-ați bucurat de explorarea erorilor și a manipulării excepțiilor. Urmăriți tutorialele viitoare în programul nostru de programare cu seria Yii2 în timp ce continuăm să vă scufundăm în diferite aspecte ale cadrului.

Dacă doriți să vă aruncați o privire mai profundă în dezvoltarea de aplicații Yii, verificați seria noastră Building Your Startup With PHP care utilizează șablonul avansat al lui Yii2. Se spune povestea programării fiecărei etape a planificatorului de întâlniri. Este foarte util dacă doriți să aflați despre construirea aplicațiilor din Yii de la început.

Dacă doriți să știți când vine următorul tutorial Yii2, urmați-mă @lookahead_io pe Twitter sau verificați pagina de instructor.

Link-uri conexe

  • Documentație pentru yii \ web \ ErrorHandler
  • Manipularea erorilor (Ghidul definitiv pentru Yii 2.0)
  • Logare (Ghidul definitiv pentru Yii 2.0)
  • Yii2 Developer Exchange (site-ul resurselor autorului)
Cod