Exemplu PHP Try Catch: Tutorial de gestionare a excepțiilor și erorilor
⚡ Rezumat inteligent
Gestionarea erorilor și excepțiile în PHP mențin aplicațiile stabile și securizate prin gestionarea condițiilor neașteptate în loc să expună erorile brute. Această explicație explică erorile versus excepțiile, instrucțiunile die, rutinele de tratare a erorilor personalizate, nivelurile de raportare a erorilor și modelul de excepții try, throw și catch cu mai multe tipuri de excepții.

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 un rezultat neașteptat al programului care poate fi gestionat chiar de programul respectiv.
Exemple de excepții 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ă gestionăm excepțiile?
- Evitați rezultatele neașteptate pe paginile noastre, care pot fi foarte enervante sau iritante pentru utilizatorii 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 modifica fluxul normal al unui program dacă apare o 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 modalități de a gestiona erorile. Vom analiza trei metode utilizate în mod obișnuit:
- Die declarații – funcția die combină funcțiile echo și exit într-una singură. Este foarte utilă atunci când dorim să afișăm 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 depinde de setările de raportare a erorilor PHP. Această metodă este foarte utilă într-un mediu de dezvoltare atunci când nu aveți nicio idee despre ce a cauzat eroarea. Informațiile afișate vă pot ajuta să depanați aplicația.
Exemple de manipulare a erorilor
Să analizăm acum câteva exemple simple cu rutine de tratare a erorilor.
Să presupunem că avem un calcul care poate împărți un număr la zero. Vrem să gestionăm acest caz în mod clar, în loc să lăsăm PHP să afișeze o eroare brută.
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 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 gestionator 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 fișierul URL http://localhost/phptuts/error_handling.php
Notă: Este o bună practică de securitate să afișați un mesaj precum cel de mai sus în loc să afișați un mesaj brut precum „Fișier negă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 "Oops, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Deschideți URL http://localhost/phptuts/custom_error_handler.phpVeți obține următoarele rezultate.
După cum puteți vedea din exemplul de mai sus, rutinele de tratare a erorilor personalizate sunt puternice în sensul că:
- Acestea ne permit să personalizăm mesajele de eroare.
- Tratamentul de tratare a erorilor personalizat poate include, de asemenea, înregistrarea erorilor într-un fișier sau într-o bază de date, trimiterea de e-mailuri către dezvoltator și acțiuni similare.
Să analizăm acum al treilea tip de gestionare a erorilor. Vom folosi funcția error_reporting încorporată în PHP. Aceasta 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 și poate fi folosit pentru a seta nivelul de raportare. Dacă nu a fost specificat niciun nivel de raportare, PHP va utiliza 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 instrument de gestionare a erorilor personalizat | 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 folosind rutine de tratare a 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țiile sunt generate și destinate a fi detectate, î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 generată o excepție, este creat un obiect de excepție care conține detaliile excepției.
Tabelul de mai jos prezintă metodele obiectului de excepție.
| Metodă | Descriere | Exemplu |
|---|---|---|
| getMessage () | Afișează mesajul excepției |
<?php
echo $e->getMessage();
?>
|
| obțineCode() | 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();
?>
|
| obțineTrace() | Afișează o matrice a spateluitrace înainte de excepție |
<?php print_r( $e->getTrace()); ?> |
| getPrevious() | Afișează excepția anterioară înaintea celei actuale |
<?php
echo $e->getPrevious();
?>
|
| obțineTraceCaȘir() | Afișează spateletrace a excepției ca șir de caractere î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 de excepție și transmite șirul „Acesta este un exemplu de excepție” ca parametru al mesajului.
Codul de mai sus afișează următorul mesaj.
Acum vom analiza un exemplu care implementează excepțiile throw și catch. Vom modifica exemplul de mai sus și vom include excepțiile try, throw și catch.
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 prezintă exemplul de excepție de bază cu implementarea funcțiilor try, throw și catch. Programul lansează în mod deliberat o excepție pe care apoi o captează.
<?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 URL http://localhost/phptuts/exception_handling.phpVeți obține următoarele rezultate.
De asemenea, este posibil să creați mai multe excepții pentru o singură instrucțiune try PHP, în funcție de tipul de excepție generată.
Vezi articolul pe MySQLAcces la date PHP pentru exemple de implementare a excepțiilor multiple.
Excepții multiple
Excepțiile multiple utilizează mai multe blocuri 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ă
Schema de flux de mai jos ilustrează cum funcționează excepțiile multiple.
Să luăm în considerare un exemplu care utilizează excepții multiple. Vom modifica codul care împarte un număr la numitorul transmis.
Ne așteptăm să apară două tipuri de excepții:
- Impartirea cu zero
- Împărțirea cu un număr negativ
Pentru simplitate, vom afișa doar tipul excepției în blocurile noastre catch. Clasa Exception încorporată în PHP este utilizată pentru a genera excepții. Vom crea două clase care extind clasa Exception și le vom folosi pentru a genera 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 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 URL http://localhost/phptuts/multiple_exceptions.phpCe rezultate obțineți? Acum treceți 3 ca parametru. Ce rezultate obțineți?
Blocul finally și modelul de erori PHP 7
PHP-ul modern adaugă două componente importante modelului de mai sus. Blocul finally rulează după try și catch, indiferent dacă a fost generată o excepție, ceea ce îl face ideal pentru curățare, cum ar fi închiderea unui fișier sau a unei conexiuni la baza de date.
Începând cu PHP 7, multe dintre fostele erori fatale sunt generate ca obiecte Error. Atât Exception, cât și Error implementează interfața Throwable, deci un bloc catch (\Throwable $e) le poate gestiona pe oricare dintre ele.
<?php try { $result = 10 / 0; } catch (DivisionByZeroError $e) { echo "Caught: " . $e->getMessage(); } finally { echo "This message always runs"; } ?>
Aici, împărțirea la zero generează o eroare DivisionByZeroError în PHP 8, blocul catch o raportează, iar blocul finally rulează întotdeauna, afișând mesajul său indiferent dacă a apărut sau nu o eroare.








