Lecții în PHP: Afișați erori și gestionarea erorilor

Lecții în PHP: Afișați erori și gestionarea erorilor

Lecții în PHP: Afișați erori și gestionarea erorilor

PHP este cel mai popular limbaj de programare web pe partea de server astăzi, așa că este important să știți cum să rezolvați orice erori care pot apărea la executarea codului dvs. PHP.

În acest articol, ne vom uita la elementele de bază despre gestionarea erorilor în PHP, folosind funcțiile încorporate, scriind funcții personalizate de gestionare a erorilor și cu gestionarea erorilor Exception.

Tipurile de erori în PHP

Există două tipuri fundamentale de erori în software:

  • Erori interne : acestea sunt erorile logice din codul dvs. Aceste erori pot fi prevenite într-o măsură foarte mare printr-o programare atentă.
  • Erori externe : Acestea sunt erori legate de interacțiunile cu lumea din afara codului dvs. (de exemplu, eșecul în deschiderea unui fișier sau a unei baze de date, scăderea conexiunii la rețea, imposibilitatea de a încărca un anumit modul PHP etc.). Aceste erori vor apărea întotdeauna, dar impactul lor poate fi atenuat. Cu cât vă pregătiți mai bine codul pentru aceste erori externe, presupunând cât mai puțin posibil când se execută codul, cu atât mai puțin aceste erori vă vor afecta negativ programul.

Modalități de a face față erorilor PHP

Odată ce apar erori și le detectăm, există patru moduri fundamentale de a le trata:

  • Afișează eroarea : Aceasta permite ca eroarea să fie afișată dezvoltatorului și/sau utilizatorului atunci când programul este în curs de execuție.
  • Înregistrați eroarea : Aceasta permite stocarea și examinarea erorilor dintr-un fișier jurnal textual.
  • Acționați asupra erorii : tipul de acțiune necesar va fi diferit pentru fiecare situație de program.
  • Ignorați eroarea : aceasta trebuie evitată întotdeauna.

În acest articol, ne vom concentra pe afișarea, înregistrarea și gestionarea erorilor. Odată ce știi cum să gestionezi erorile, poți acționa cu ușurință asupra lor.

Se afișează erori și setări de raportare a erorilor

În funcție de dacă rulăm cod în producție sau în dezvoltare, este posibil să dorim să pornim sau să dezactivăm raportarea anumitor tipuri de erori.

Există diferite locații în care putem controla ce tipuri de erori trebuie raportate:

  • În fișierul php.ini
  • În fișierul .htaccess de pe serverul dvs. web
  • Din propriul cod PHP.

O descriere completă a valorilor de configurare a erorilor PHP poate fi găsită aici. Acestea sunt cele mai relevante opțiuni cu valoarea lor implicită:

Opțiuni pentru afișarea erorilor PHP

Există patru opțiuni posibile pentru afișarea erorilor PHP:

  • error_reporting : setați nivelul de raportare a erorilor. Valoarea implicită este: „E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED”, ceea ce înseamnă că această setare nu afișează erori de nivel E_NOTICE, E_STRICT și E_DEPRECATED.
  • display_errors : Setați-l la „ON” (implicit este „OFF”) dacă erorile vor fi tipărite pe ecran.
  • log_errors : Aceasta indică dacă ar trebui să fie efectuată sau nu înregistrarea erorilor; valoarea implicită este „pornit”.
  • error_log șir : Setează numele fișierului în care ar trebui să fie înregistrate erorile de script

Să vedem cum putem folosi aceste opțiuni de configurare.

În timpul dezvoltării, s-ar putea să dorim să transformăm toate rapoartele de eroare din php.ini :

display_errors = on error_reporting = E_ALL

Am putea face același lucru din codul nostru PHP în timpul rulării apelând funcția error_reporting() :

raportare_erori(E_ALL);

Pentru a activa înregistrarea erorilor și a înregistra erorile în propriul nostru fișier jurnal (în loc de fișierul jurnal de erori implicit, care este adesea fișierul jurnal de erori de la serverul web sau fișierul syslog), am putea configura PHP cu:

log_errors = on error_log = „/tmp/php-error.log”

Acum puteți înregistra erorile prin codul dvs. PHP:

error_log( „Acest cod are erori!”);

Niveluri de eroare încorporate

PHP are în prezent 15 constante de eroare predefinite, fiecare cu propriul număr de identificare (mască de biți). Acestea sunt tipuri de erori încorporate pe care PHP sau tu, dezvoltatorul, le poți declanșa atunci când apare o eroare. Puteți decide ce tipuri de erori doriți să raportați, așa cum vom vedea în secțiunea următoare.

Acestea sunt tipurile de erori PHP încorporate:

Tip Descriere
E_EROARE Erori fatale de rulare
E_AVERTISMENT Avertismente de rulare (erori non-fatale)
E_PARSE Erori de analiză în timpul compilării
E_NOTIZARE Notificări de timp de execuție
E_CORE_ERROR Erori fatale care apar în timpul pornirii inițiale a PHP
E_CORE_AVERTISMENT Avertismente (erori non-fatale) care apar în timpul pornirii inițiale a PHP
E_COMPILE_ERROR Erori fatale la timp de compilare
E_COMPILE_WARNING Avertismente în timpul compilării (erori nefatale)
E_USER_ERROR Mesaj de eroare generat de utilizator
E_USER_AVERTISMENT Mesaj de avertizare generat de utilizator
E_USER_NOTICE Mesaj de notificare generat de utilizator
E_STRICT Activați pentru ca PHP să sugereze modificări ale codului dvs. care vor asigura cea mai bună interoperabilitate și compatibilitate directă a codului dvs
E_RECOVERABLE_ERROR Eroare fatală interceptabilă
E_DEPRECATED Notificări de timp de execuție
E_USER_DEPRECATED Mesaj de avertizare generat de utilizator
E_TOȚI Toate erorile și avertismentele, așa cum sunt acceptate

Iată câteva exemple de cod ale acestor constante de eroare declanșate:

// E_ERROR nonExistingFunction(); // E_WARNING $fh = fopen(‘fișier-nici-existent’, ‘r’); // E_NOTICĂ $x = $y + 5; // $y nu a fost definit // E_USER_ERROR if ($divisor == 0) { trigger_error(„Nu se poate împărți la zero”, E_USER_ERROR); // eroare declanșată de dezvoltator }

Crearea de gestionare a erorilor personalizate

Acum că putem configura PHP pentru a-i spune despre ce tipuri de erori să raportăm, trebuie să fim capabili să gestionăm diferite tipuri de erori în felul nostru. Doar afișarea mesajelor de eroare PHP standard nu este adesea suficient de bună.

Dorim să gestionăm eroarea și să ne afișăm propriile mesaje atunci când se întâmplă o eroare. Pentru aceasta, putem folosi funcția set_error_handler() .

Iată o funcție personalizată foarte simplă de gestionare a erorilor:

// funcția de gestionare a erorilor funcția errorHandler($errno, $errstr) { echo „Eroare: [$errno] $errstr”; } // setează gestionarea erorilor set_error_handler(“errorHandler”); // declanșează o eroare echo($foo); // variabila nedefinita!

Deci, atunci când apare o eroare, funcția personalizată de gestionare a erorilor este apelată cu un argument numărul de eroare și un argument șir de eroare. Aceste două argumente sunt transmise de la apelul set_error_handler() către funcția noastră.

Există mai multe argumente pe care le-am putea folosi, așa cum vom vedea în curând, dar rezultatul rulării acestui cod ar fi:

Eroare: [8] Variabilă nedefinită: foo

Să vedem cum ar putea arăta o funcție personalizată de tratare a erorilor puțin mai puțin simplă. Acest handler de erori ar trebui să poată detecta tipurile de eroare și să decidă ce acțiune să ia și/sau ce mesaj de eroare să afișeze.

function errorHandler($errno, $errstr, $errfile, $errline) { switch ($errno) { case E_NOTICE: case E_USER_NOTICE: case E_DEPRECATED: case E_USER_DEPRECATED: case E_STRICT: echo(“STRICT error $errstr at $errline file:$errline: n”); pauză; case E_WARNING: case E_USER_WARNING: echo(„AVERTISMENT eroare $errstr la $errfile:$errline n”); pauză; case E_ERROR: case E_USER_ERROR: case E_RECOVERABLE_ERROR: exit(„Eroare FATALă $errstr la $errfile:$errline n”); implicit: exit(„Eroare necunoscută la $errfile:$errline n”); } } set_error_handler(„errorHandler”); $foo = fals; if (! $foo) { trigger_error(‘Valoarea $foo trebuie să fie adevărată’, E_USER_NOTICE); }

Observați cum grupăm gestionarea anumitor tipuri de erori utilizând funcționalitatea fall-through a declarațiilor switch-case.

Ieșirea ar fi ceva de genul:

Eroare STRICT Valoarea $foo trebuie să fie adevărată la /tmp/test.php:32

Acum puteți gestiona tipurile de erori diferit (sau la fel) și puteți afișa și un mesaj de eroare personalizat. Desigur, o funcție personalizată de tratare a erorilor ar trebui să poată face mult mai mult cu erorile și, eventual, să acționeze asupra lor într-un mod specific și sensibil.

Este important să păstrați funcția dvs. personalizată de gestionare a erorilor simplă și robustă pentru a vă asigura că nu apar erori în cadrul acestei funcții, deoarece acestea nu vor fi raportate. Există mai multe biblioteci PHP care vă pot ajuta să creați o gestionare mai avansată a erorilor.

Utilizarea excepțiilor PHP

PHP versiunea 5 a introdus un alt mod de a gestiona erorile: Excepțiile.

Gestionarea excepțiilor este utilizată pentru a schimba fluxul normal al unui program care rulează dacă apare o condiție de eroare specificată. Este o modalitate mai integrată de sintaxă a limbii de a gestiona erorile decât a scrie funcții personalizate de gestionare a erorilor.

Excepțiile sunt reprezentate în PHP de clasa Exception. Excepțiile sunt ridicate folosind sintaxa „throw” și pot fi prinse folosind un bloc de sintaxă „try/catch”. Orice cod în care poate apărea o eroare Eexception ar trebui plasat în blocul „try”, care poate fi urmat de un bloc „catch” pentru a gestiona eroarea. Pe măsură ce excepțiile aruncate cresc în stiva de coduri, acestea pot fi gestionate și de alte blocuri „catch” din codul tău.

Iată cum arată sintaxa Excepție:

try { // arunca erori în try-block // dacă apare o eroare, putem arunca o excepție throw new Exception(‘aceasta este o eroare.’); } catch(Exception $e) { // prinde aruncările în catch-block // face ceva cu obiectul excepție, de ex. afișează mesajul său echo ‘Mesaj de eroare: ‘ .$e->getMessage(); }

Care ar scoate:

Mesaj de eroare: aceasta este o eroare.

După ce este aruncat un obiect Exception, putem accesa aceste funcții membre:

  • getMessage() primește mesajul de excepție
  • getPrevious() returnează excepția anterioară
  • getCode() primește codul de excepție
  • getFile() primește fișierul în care a avut loc excepția
  • getLine() primește linia în care a avut loc excepția
  • getTrace() primește urmărirea stivei
  • getTraceAsString() primește urmărirea stivei ca șir
  • __toString() este o reprezentare șir a excepției
  • __clone() clonează excepția

Iată un alt exemplu de gestionare a excepțiilor:

$fișier = ‘/tmp/foo.txt’; încercați { // verificați dacă fișierul există și poate fi scris dacă (! fișier_există($fișier) || ! is_writable($fișier) ) { // dacă nu: aruncați o excepție aruncați o nouă excepție(‘Fișier ‘ .$fișier. ‘ nu a fost găsit sau nu poate fi scris.’); echo(‘va ajunge codul aici?’); // nu dacă o excepție a fost aruncată înainte } } catch(Exception $e) { echo ‘Mesaj de eroare: ‘ .$e->getMessage(); returnează fals; }

Dacă rulați acest cod fără a crea mai întâi fișierul, veți vedea această eroare:

Mesaj de eroare: Fișierul /tmp/foo.txt nu a fost găsit sau nu poate fi scris.

Excepțiile ridică stiva de coduri, astfel încât să putem avea mai multe instrucțiuni throw în diferite blocuri de cod și să le gestionăm în continuare cu grație. Cu toate acestea, orice excepții care sunt aruncate, dar nu prinse vor genera o eroare E_FATAL cu mesajul „Excepție neprinsă”.

Un exemplu:

$foo = 10; încercați { if( is_numeric($foo) ){ if ($foo > 5){ throw new Exception(‘number too high’); // acest lucru va fi aruncat } } else { throw new Exception(‘nu este un tip de număr’); } } catch(Exception $e) { echo ‘Mesaj de eroare: ‘ .$e->getMessage() . ‘ la linia: ‘ . $e->getLine(); //întoarce false; }

Rețineți că am numit funcția membru „$e->getLine()” a obiectului Exception pentru a obține numărul de linie atunci când a fost lansată Excepția.

Este posibil să așezați mai multe blocuri try-throw-catch unul în celălalt. Acest lucru vă permite să specificați ce eroare de excepție este tratată unde (într-un mod curat și simplu) în punctul din codul dvs. unde are cel mai mult sens. Nu uitați să puneți întotdeauna orice cod care se aruncă într-un bloc „încercați”.

Manageri personalizat de excepții

Până acum am folosit clasa încorporată Exception, dar putem scrie și propriul nostru handler personalizat Exception prin extinderea clasei încorporate Exception. Acest lucru este util atunci când dorim să suprascriem funcțiile membre încorporate sau să adăugăm funcții membre noi. Puteți vedea mai multe exemple de coduri aprofundate aici.

Diferența dintre erori standard și excepții

Tratarea erorilor standard este modalitatea mai veche de a gestiona erorile în PHP. Gestionarea excepțiilor este disponibilă numai începând cu PHP 5 și necesită utilizarea unei structuri de programare orientată pe obiecte.

Ambele pot fi folosite unul lângă altul. De fapt, orice excepție care este aruncată, dar nu este prinsă, va genera în cele din urmă o eroare E_FATAL cu mesajul „Excepție neprinsă”.

Cu exemplul de cod al funcției set_error_handler() prezentat mai jos, am putea chiar să gestionăm toate erorile standard ca o excepție:

set_error_handler(funcție ($errno, $errstr, $errfile, $errline ) { if (error_reporting()) { throw new ErrorException($errstr, 0, $errno, $errfile, $errline); } }); try { // E_WARNING $fh = fopen(‘none-existing-file’, ‘r’); } catch(Exception $e) { echo ‘Mesaj de eroare: ‘ .$e->getMessage(); returnează fals; }

Cuvântul final

Sper că această introducere rapidă în gestionarea erorilor PHP v-a ajutat să înțelegeți această parte importantă a dezvoltării. Acum ar trebui să știți cum să afișați și să înregistrați erorile și să le gestionați în diferitele moduri în care PHP le face posibil, fie cu o funcție personalizată de gestionare a erorilor, fie prin gestionarea excepțiilor.

Dezvăluirea agentului de publicitate

Gazduirweb este o resursă online gratuită care oferă utilizatorilor conținut valoros și servicii de comparare. Pentru a menține această resursă 100% gratuită, primim compensații de la multe dintre ofertele afișate pe site. Alături de factorii cheie de revizuire, această compensație poate afecta modul în care și locul în care apar produsele pe site (inclusiv, de exemplu, ordinea în care apar). Gazduirweb nu include întregul univers al ofertelor disponibile. Opiniile editoriale exprimate pe site sunt strict ale noastre și nu sunt furnizate, susținute sau aprobate de agenții de publicitate.

Politica noastră de revizuire editorială

Site-ul nostru se angajează să publice conținut independent, precis, ghidat de reguli editoriale stricte. Înainte ca articolele și recenziile să fie publicate pe site-ul nostru, acestea sunt supuse unui proces amănunțit de revizuire efectuat de o echipă de editori independenți și experți în materie pentru a asigura acuratețea, actualitatea și imparțialitatea conținutului. Echipa noastră editorială este separată și independentă de agenții de publicitate ai site-ului nostru, iar opiniile pe care le exprimă pe site-ul nostru sunt proprii. Pentru a citi mai multe despre membrii echipei noastre și despre mediul lor editorial, vă rugăm să vizitați pagina Despre a site-ului nostru.

Leave a Reply

Copyright © 1999 - 2022 Phox Operating Company