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.

  • ⚠️ Eroare vs. Excepție: O eroare este, în general, irecuperabilă, în timp ce o excepție este un rezultat neașteptat pe care programul îl poate detecta și gestiona.
  • 🛡️ De ce să se ocupe de: Gestionarea erorilor previne ieșirile nedorite, protejează utilizatorii și evită scurgerea de detalii pe care atacatorii le-ar putea exploata.
  • 🛑 Declarații despre matrițe: Funcția die afișează un mesaj și oprește scriptul, o modalitate rapidă de a opri execuția atunci când ceva eșuează.
  • 🛠️ Manipulatoare personalizate: `set_error_handler()` direcționează erorile către propria funcție, astfel încât să puteți înregistra, trimite prin e-mail sau formata mesajele în felul vostru.
  • 📢 Raportarea erorii: error_reporting() și niveluri precum E_ALL controlează avertismentele și notificările afișate de PHP, utile în timpul dezvoltării.
  • 🧲 Încearcă, Aruncă, Prinde: Un bloc try rulează cod riscant, throw ridică o excepție, iar catch o gestionează folosind metodele obiectului exception.
  • 🤖 Asistență AI: Instrumentele de inteligență artificială pot adăuga gestionarea try-catch la codul existent și pot explica o stivă confuză. trace sau mesaj de eroare.

Gestionarea erorilor și excepțiilor PHP

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:

  1. 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.
  2. Gestionare de erori personalizate – acestea sunt funcții definite de utilizator care sunt apelate ori de câte ori apare o eroare.
  3. 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.

Gestionarea erorilor PHP

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

Mânerul de excepție PHP în 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.

Gestionarea erorilor PHP

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.

Mânerul de excepție PHP în PHP

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.

Mânerul de excepție PHP în PHP

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.

Excepții 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

Mânerul de excepție PHP în PHP

Reveniți la fișierul PHP și treceți -1 ca parametru așa cum se arată în diagrama următoare.

Mânerul de excepție PHP în PHP

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.

Întrebări frecvente

În producție, setează display_errors pe Off și log_errors pe On în php.ini și indică error_log către un fișier. De asemenea, poți apela error_log('message') pentru a înregistra intrări personalizate fără a expune nimic vizitatorilor.

Funcția try-catch gestionează excepțiile care sunt generate cu cuvântul cheie throw. Funcția set_error_handler interceptează erorile și avertismentele tradiționale PHP. În PHP 7 și versiunile ulterioare, multe dintre erorile anterioare sunt generate ca obiecte Error pe care le puteți detecta și ele.

O excepție neinterceptată devine o eroare fatală, oprește scriptul și afișează un mesaj de excepție neinterceptată cu o stivă. trace. Un handler global setat cu set_exception_handler poate detecta aceste excepții ca ultimă soluție.

Da. IA poate încadra operațiunile riscante în blocuri try-catch, poate alege tipurile de excepții corecte, poate adăuga un bloc finally pentru curățare și poate înregistra eroarea. Revvede că nu înghite excepțiile pe care trebuie să le vezi.

Da. Lipiți mesajul și trace, iar AI poate identifica linia defectă, lanțul de apeluri care a dus acolo și cauza probabilă, apoi poate sugera o soluție, cum ar fi o verificare nulă sau un argument corectat.

Rezumați această postare cu: