Erori si Exceptii

postat acum 2 ani de Stefanescu Mihai in categorie PHP

Procesul de error handling este procesul de aflare a erorilor programului tau si de rezolvare intr-un mod eficient. Daca acest lucru nu este facut corect poate avea consecinte neprevazute.Folosirea functiei die()

In timp ce scriem programe PHP ar trebuii sa ne gandim si la erori inainte de a junge intr-un stadiu in care este tarziu deja.

Iata un mod in care putem folosi functia die() in cazul in care nu exista fisierul cerut:

<?php
if(!file_exists("/tmp/test.txt")){
 die("Fisierul nu a fost gasit");
 }else{
 $file=fopen("/tmp/test.txt","r");
 print "Fisierul a fost deschis";
 }
?>

In modul acesta puteti scrie un cod eficient. Folosind tehnica de mai sus puteti executia oricarui program de fiecare data cand apare o eroare si puteti afisa un mesaj din care utilizatorul poate intelege ceva.

Functii Custom pentru Error Handling

Puteti scrie prorpriile functii pentru tratarea erorilor. PHP va vine in ajutor cu un framework pentru definirea functiilor pentru tratarea erorilor.

Aceste functii au nevoie de cel putin 2 parametrii (nivelul erorii si mesajul erorii) dar pot primi pana la 5 paremtri(optional: fisier, numarul liniei, context-ul erorii):

Sintaxa

functie_eroare(nivel_eroare,mesaj_eroare, fisier_eroare,linie_eroare,context);
Parametru Descriere
nivel_eroare Necesar – specifica nivelul erorii. Trebuie data o valoare numerica.
mesaj_eroare Necesar – specifica mesajul de eroare.
fisier_eroare Optional – specifica fisieurl in care a fost generata eroarea.
linie_eroare Optional – specifica linia aparitiei erorii
context Optional – specifica un array cu fiecare variabila si valoarea ei ce erau folosite atunci cand a aparut eroarea.

Nivele Eroare

Aceste nivele de eroare sunt diferitele tipuri de erori ce pot sa apara.

Valoare Constanta Descriere
1 E_ERROR Eroare de run-time fatala. Executia scriptului este oprita.
2 E_WARNING Eroare de run-time non-fatala. Executia scriptului nu este oprita.
4 E_PARSE Eroare compile-time la parse. Aceste erori sunt generate doar de parser.
8 E_NOTICE Instiintare Run-time.Scriptul a gasit ceva ce s-ar putea sa fie o eroare.
16 E_CORE_ERROR Eroare fatala ce apare la startup-ul initial al PHP-ului.
32 E_CORE_WARNING Eroare de run-time non-fatala ce apare la startup-ul initial al PHP-ului.
256 E_USER_ERROR Eroare fatala generata de utilizator. Aceasta eroare este exact ca si E_ERROR doar ca a fost setata de programator folosind functia trigger_error()
512 E_USER_WARNING Warning non-fatal generat de utilizator. Aceasta este exact ca si E_WARNING doar ca este setat de programator cu functia trigger_error()
1024 E_USER_NOTICE Instiintare generata de utilizator. Aceasta este exact ca si E_NOTICE doar ca este setat de programator cu functia trigger_error()
 2048  E_STRICT Instiintare Run-time. Activat sugereaza schimbari in cod pentru o mia buna interoperabilitate.
 4096  E_RECOVERABLE_ERROR Acest nivel este ca si E_ERROR doar ca poate fi prins cu un handle definit de user(vezi set_error_handler())
 8191  E_ALL Toate erorile si warning-urile cu exceptia E_STRICT (E_STRICT va face parte din E_ALL incepand cu PHP 6.0)

Toate nivelele de eroare de mai sus pot fi folosite cu ajutorul functiei specia create pentru asa ceva.

int error_reporting ( [int $nivel] )

Iata si un exemplu de functie care sa se ocupe de erori:

<?php
function afisare_erori($err_no, $err_msg,$error_file,$error_line)
{ 
 echo "<b>Error:</b> {$err_no} {$err_msg} - {$error_file} : {$error_line}";
 echo "<br />";
 echo "Oprire script PHP!";
 die();
}
?>

O data definita functia de procesat erorile trebuie sa o setam in libraria PHP folosind functia set_error_handler. Acum hai sa ne uitam la acest exemplu ce apeleaza o functie ce nu exista.

<?php
function afisare_erori($err_no, $err_msg,$error_file,$error_line)
{ 
 echo "<b>Error:</b> {$err_no} {$err_msg} - {$error_file} : {$error_line}";
 echo "<br />";
 echo "Oprire script PHP!";
 die();
}
//setare functie eroare
set_error_handler("afisare_erori");

//eroare
myFunction();
?>

Exceptions Handling:

PHP 5are un model de exceptii similar cu al altor limbaje. Exceptiile sunt importante pentru ca ne dau un control mai mare asupra erorilor.

Cand discutam despre exceptii discutam despre urmatoarele cuvinte cheie:

  • Try – O functie ce primeste o exceptie trebuie sa fie pusa intr-un block “try”. Daca exceptia nu este pornita codul va rula in mod normal, dar daca este pornita va fi “aruncata”(throw) o exceptie.
  • Throw – Asa pornesti o exceptie. Fiecare Throw trebuie sa aiba un catch.
  • Catch – -Un block “catch” “prinde” exceptia si creeaza un obiect cu informatiile acesteia.

Cand o exceptie este aruncata, codul ce urmeaza dupa ea nu va mai rula, iar PHP-ul va cauta primul bloc catch. Daca nu este gasit catch-ul si exceptia nu este “prinsa” PHP-ul va genera o eroare fatala cu mesajul “Uncaught Exception”.

Iata un exemplu:

<?php
try {
    $error = 'Mereu arunca aceasta eroare';
    throw new Exception($error);

    // Acest cod nu va mai fi executat
    echo 'Nu este executat';

} catch (Exception $e) {
    echo 'Exceptie prinsa: ',  $e->getMessage(), "\n";
}

// Cod executat
echo 'Salut!';
?>

In exemplul de mai sus folosim functia $e->getMessage() pentru a prelua mesajul de eroare. Clasa Exception ne pune la dispozitie urmatoarele functii.

  • getMessage()- mesajul exceptiei
  • getCode() – codul exceptiei
  • getFile() – fisierul sursa
  • getLine() – linia
  • getTrace() – un array de backtrace()
  • getTraceAsString() – un string formatat de trace

Exceptii Custom

Va puteti definii propriile functii pentru exceptii precum in exemplul de mai jos:

<?php
function exception_handler($exception) {
  echo "Exceptie de prinsa: " , $exception->getMessage(), "\n";
}

set_exception_handler('exception_handler');

throw new Exception('Exceptie ne prinsa');

echo "Cod ce nu este executat\n";
?>

 

Sunt un tanar programator din Bucuresti ce lucreaza in PHP/Mysql (MySqli/PDO), Laravel, CodeIgniter, MySQL, PostgreSQL, Wordpress, HTML5/CSS3, Sass, Photoshop si multe altele.
Google+ Community Facebook Group
Acest articol a fost mutat de pe vechea platforma.
Pentru orice eroare aparuta la mutare va rog sa ma contactati!