Exemplu PHP Try Catch: Tutorial de gestionare a excepțiilor și erorilor
Ce este o excepție?
O eroare este un rezultat neașteptat al unui program care nu poate fi gestionat de programul însuși.
Erorile sunt rezolvate prin repararea programului. Un exemplu de eroare ar fi o buclă infinită care nu se oprește niciodată din executare.
O excepție este rezultatul neașteptat al programului care poate fi gestionat de programul însuși.
Exemplele de excepție includ încercarea de a deschide un fișier care nu există.
Această excepție poate fi gestionată fie prin crearea fișierului, fie prin prezentarea utilizatorului cu opțiunea de căutare a fișierului.
De ce să gestionezi excepția?
- Evitați rezultatele neașteptate pe paginile noastre, care pot fi foarte enervante sau iritante pentru utilizatorii noștri finali
- Îmbunătățiți securitatea aplicațiilor noastre prin neexpunerea informațiilor pe care utilizatorii rău intenționați le pot folosi pentru a ataca aplicațiile noastre
- Excepțiile PHP sunt folosite pentru a schimba fluxul normal al unui program dacă apare vreo eroare previzibilă.
Gestionarea erorilor PHP
Când apare o eroare, în funcție de setările dvs. de configurare, PHP afișează mesajul de eroare în browser-ul web cu informații referitoare la eroarea care a apărut.
PHP oferă o serie de moduri de a gestiona erorile.
Vom analiza trei (3) metode frecvent utilizate;
- Die declarații– funcția matriță combină funcția de eco și de ieșire într-una singură. Este foarte util atunci când dorim să scoatem un mesaj și să oprim execuția scriptului atunci când apare o eroare.
- Gestionare de erori personalizate – acestea sunt funcții definite de utilizator care sunt apelate ori de câte ori apare o eroare.
- Raportarea erorilor PHP – mesajul de eroare în funcție de setările dvs. de raportare a erorilor PHP. Această metodă este foarte utilă în mediul de dezvoltare atunci când nu aveți idee ce a cauzat eroarea. Informațiile afișate vă pot ajuta să vă depanați aplicația.
Exemple de manipulare a erorilor
Să ne uităm acum la câteva exemple simple cu rutine de tratare a erorilor.
Să presupunem că am dezvoltat o aplicație care utilizează fișiere text pentru a stoca date. S-ar putea să dorim să verificăm existența fișierului înainte de a încerca să citim datele din acesta.
Codul de mai jos implementează exemplul de mai sus.
<?php $denominator = 0; echo 2 / $denominator; ?>
Presupunând că ați salvat fișierul simple_error.php în folderul phptuts, deschideți adresa URL http://localhost/phptuts/simple_error.php
Veți obține următoarele rezultate
După cum puteți vedea din rezultatele de mai sus, face ca aplicația noastră să pară neprofesională și poate fi enervantă pentru utilizator.
Vom modifica codul de mai sus și vom scrie un handler de erori pentru aplicație
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Presupunând că ați salvat codul de mai sus ca error_handling.php, deschideți adresa URL http://localhost/phptuts/error_handling.php
Notă: este o bună practică de securitate să afișați un mesaj ca cel afișat mai sus în loc să afișați mesajul ca „Fișierul nu a fost găsit”.
Să ne uităm la un alt exemplu care utilizează un handler de erori personalizat.
Managerul de erori personalizat va fi setat ca funcție implicită de gestionare a erorilor PHP și va afișa practic un număr de eroare și un mesaj.
Codul de mai jos ilustrează implementarea exemplului de mai sus
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Deschideți adresa URL http://localhost/phptuts/custom_error_handler.php veți obține următoarele rezultate
După cum puteți vedea din exemplul de mai sus, gestionatorii personalizați de erori sunt puternici în sensul că
- Acestea ne permit să personalizăm mesajele de eroare.
- Gestionarea erorilor personalizat poate include, de asemenea, înregistrarea erorilor într-un fișier/bază de date, trimiterea prin e-mail dezvoltatorului etc.
Să ne uităm acum la al treilea tip de tratare a erorilor. Vom folosi funcția PHP încorporată, funcția error_reporting. Are următoarea sintaxă de bază
<?php error_reporting($reporting_level); ?>
AICI,
- „error_reporting” este funcția PHP de raportare a erorilor
- „$reporting_level” este opțional, poate fi folosit pentru a seta nivelul de raportare. Dacă nu a fost specificat niciun nivel de raportare, PHP va folosi nivelul implicit de raportare a erorilor, așa cum este specificat în fișierul php.ini.
Nivel de raportare | Descriere | Exemplu |
---|---|---|
E_AVERTISMENT | Afișează numai mesajele de avertizare. Nu oprește execuția scriptului | raportare_erori(E_AVERTISMENT); |
E_NOTIZARE | Afișează notificări care pot apărea în timpul execuției normale a unui program sau ar putea fi o eroare. | raportare_erori(E_ NOTIFICARE); |
E_USER_ERROR | Afișează erorile generate de utilizator, adică un handler personalizat de erori | raportare_erori(E_USER_ERROR); |
E_USER_AVERTISMENT | Afișează mesajele de avertizare generate de utilizator | raportare_erori(E_USER_WARNING); |
E_USER_NOTICE | Afișează notificări generate de utilizator | raportare_erori(E_USER_NOTICE); |
E_RECOVERABLE_ERROR | Afișează erori care nu sunt fatale și pot fi gestionate utilizând gestionarea erorilor personalizate | raportare_erori(E_RECOVERABLE_ERROR); |
E_TOȚI | Afișează toate erorile și avertismentele | raportare_erori(E_ ALL); |
Diferența dintre erori și excepție
- Excepții sunt aruncate și intenționate a fi prinse, în timp ce erorile sunt în general irecuperabile.
- Excepțiile sunt tratate într-un mod orientat pe obiecte. Aceasta înseamnă că atunci când este aruncată o excepție; este creat un obiect excepție care conține detaliile excepției.
Tabelul de mai jos prezintă metodele obiectului excepție
Metodă | Descriere | Exemplu |
---|---|---|
getMessage () | Afișează mesajul excepției |
<?php echo $e->getMessage(); ?> |
obțineți codul() | Afișează codul numeric care reprezintă excepția |
<?php echo $e->getCode(); ?> |
ia fisierul() | Afișează numele fișierului și calea în care a apărut excepția |
<?php echo $e->getFile(); ?> |
getLine() | Afișează numărul liniei în care a avut loc excepția |
<?php echo $e->getLine(); ?> |
getTrace() | Afișează o matrice de backtrace înainte de excepție |
<?php print_r( $e->getTrace()); ?> |
getPrevious() | Afișează excepția anterioară înaintea celei actuale |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | Afișează backtrace a excepției ca șir în loc de matrice |
<?php echo $e->getTraceAsString(); ?> |
__toString() | Afișează întreaga excepție ca șir |
<?php echo $e->__toString(); ?> |
Mai jos este sintaxa de bază pentru aruncarea unei excepții.
<?php throw new Exception("This is an exception example"); ?>
AICI,
- „aruncă” este cuvântul cheie folosit pentru a arunca excepția
- „new Exception(…)” creează un obiect excepție și transmite șirul „Acesta este un exemplu de excepție” ca parametru de mesaj.
Codul de mai sus afișează următorul mesaj.
Acum vom analiza un exemplu care implementează excepțiile throw and catch.
Vom modifica exemplul de mai sus și vom include încercarea, aruncarea și prinderea.
Are următoarea sintaxă de bază.
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
AICI,
- „try{…}” este blocul de cod care trebuie executat care ar putea ridica o excepție
- „catch(Exception $e){…}” este blocul de cod care prinde excepția aruncată și atribuie obiectul excepție variabilei $e.
Codul de mai jos arată exemplul de excepție de bază cu excepția try, throw și catch implementată.
Programul aruncă în mod deliberat o excepție pe care apoi o prinde.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
Deschideți adresa URL http://localhost/phptuts/exception_handling.php Veți obține următoarele rezultate.
De asemenea, este posibil să creați mai multe excepții pentru o singură instrucțiune php try, în funcție de tipul de excepție aruncată.
Vezi articolul pe MySQL, acces la date PHP... pentru exemple de implementare a mai multor excepții
Excepții multiple
Excepție multiplă folosește mai multe blocuri try catch pentru a gestiona excepțiile aruncate. Excepțiile multiple sunt utile atunci când;
- Doriți să afișați un mesaj personalizat în funcție de excepția aruncată
- Doriți să efectuați o operațiune unică în funcție de excepția aruncată
Diagrama de mai jos ilustrează modul în care funcționează mai multe excepții
Să ne uităm la un exemplu care utilizează mai multe excepții.
Vom modifica codul care împarte un număr la numitul trecut.
Ne așteptăm să apară două tipuri de excepții;
- Impartirea cu zero
- Împărțirea cu un număr negativ
Din motive de simplitate, vom afișa doar tipul de excepție în blocurile noastre de captură.
PHP construit în clasa Exception este folosit pentru a arunca excepții.
Vom crea două clase care extind clasa de excepții și le vom folosi pentru a arunca excepții.
Codul de mai jos arată implementarea.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
Testarea codului
Vom presupune că ați salvat multiple_exceptions.php în folderul phptuts.
Navigați la adresa URL http://localhost/phptuts/multiple_exceptions.php
Reveniți la fișierul PHP și treceți -1 ca parametru așa cum se arată în diagrama următoare.
Navigați la adresa URL http://localhost/phptuts/multiple_exceptions.php.
Ce rezultate obtii? Treceți 3 ca parametru.
Ce rezultate obtii?
Rezumat
- Erorile sunt rezultate neașteptate produse de codul PHP
- Gestionarea erorilor îmbunătățește performanța aplicației
- PHP are funcții încorporate care pot fi folosite pentru a personaliza modul în care PHP raportează erorile
- Excepțiile sunt ca erorile, dar pot fi prinse folosind blocul catch atunci când sunt aruncate.
- Afișarea mesajelor de eroare care afișează informații despre eroare este considerată o practică proastă de securitate.