Procesarea exceptiilor – clasa rescrisa : try { } catch {} in PHP
2In urmatoarele saptamani incet incet voi prezenta mini-idei care dupa parerea mea sunt interesante din toate punctele de vedere : studiu, utilitate etc.
Astazi vom incerca sa lucram si sa tratam exceptiile in PHP.Pentru inceput vom incerc sa explicam despre ce este vorba. In general, pentru a putea administra mai dragut o aplicatie PHP putem „ridica” niste mesaje care vor opri executia codului si care vor putea fi interpretate de administrator : afisarea,stocarea mesajelor de eroare etc. Practic vom avea posibilitatea de a opri executia codului , creand propriile noastre erori de „sintaxa”,”logica” etc.
Pentru asta vom folosi o clasa pusa la dispozitia programatorilor PHP : „Exception” . Aceste exceptii pot fi interceptate de „operatorii” :
try { } catch() {}
Vom lucra direct pe exemplu :
< ?php try { .... if(ceva_nu_e_bine) { throw new Exception("Nu ne convine o chestie"); //aruncam eroarea } .... } catch(Exception $e) { //prindem eroarea in $e echo $e->getMessage(); //afisam mesajul : "Nu ne convine o chestie " } ?>
Practic daca noi dori sa ridicam o exceptie intr-un anumit punct, codul va sari pana la „catch” dupa care va executa codul de acolo si va trece mai departe dupa „catch”.Clasa mai suporta cateva functii ce le puteti gasi la structura clasei.
Ok , toate bune si frumoase…dar ce ar fi sa putem lucra mai dragut cu logurile, sa nu afisam exceptiile pe ecran ci sa le salvam intr-un FISIER si nu in baza de date, ceva gen „log acces”. Problema la log acces este ca exista sanse sa fie descoperite de un utilizator.Voi prezenta o clasa extinsa a celei prezentate mai sus, si un mic sistem care adauga logurile intr-un fisier „special”, informatiile neavand posibilitatea de a fi vizualizate decat de anumite persoane cu un acces specific.
Mai exact, logurile vor fi stocate intr-un fisier PHP, dar logurile vor putea afisate doar daca vom accesa linkul de forma : logs.php?show=logs . Aceasta idee poate fi dezvoltata, avand posibilitatea de a face si un mini sistem de autentificare.
Pentru inceput vom extinde clasa Exception folosind de acum cException.
class cException extends Exception { private $showErrorToClient = FALSE; public function __construct($message = "",$status = 0) { $this->showErrorToClient = $status; parent::__construct($message); } public function getErrorMessage() { $error = "Error on line ".$this->getLine()." in ".$this->getFile()." : ".$this->getMessage(); return $error; } public function getStatus() { return $this->showErrorToClient; } }
Pentru a adauga logurile vom crea o functie ce va salva logurile :
private function addErrorLog($message) { $logsFile = "logs/error.logs.php"; //fisierul in care se salveaaz logurile $fh = fopen($logsFile,"r"); if(!$fh) return FALSE; $content = ""; while(!feof($fh)) $content .= fread($fh,1024); fclose($fh); preg_match('/\$content="(.*?)";/s',$content,$oldContent); $newContent = $oldContent[1].$message."\r\n"; $content = "< ?php\r\n\$content=\"".$newContent."\";\r\n". substr($content, strpos($content,"########")); $fh = fopen($logsFile,"w"); if($fh) { fwrite($fh,$content,strlen($content)); fclose($fh); } }
Avem nevoie sa "prelucram putin" fisierul error.logs.php pentru a fi gata pentru inregistrarea problemelor.
< ?php $content=" "; ################ if(isset($_GET['show']) && $_GET['show'] == 'logs') { echo $content; } else { header("HTTP/1.0 404 Not Found"); echo "404 Not Found Not Found
The requested URL /logs/error.logs.php was not found on this server.
Apache Server at site.com Port 80"; } ?>
Acum modificarile la primul exemplu de lucru cu clasa Exception.
< ?php try { .... if(ceva_nu_e_bine) { throw new cException("Nu ne convine o chestie"); //aruncam eroarea de tip cException } .... } catch(cException $e) { //prindem eroarea in $e de tipul cException addErrorLog($excpt->getErrorMessage()); }
Acum cand vom accesa fisierul logs/error.logs.php va returna cod 404(fisier inexistent) dar daca vom apela logs/error.logs.php?show=logs va returna intregul log.
In urmatoarele cateva articole ne vom folosi de clasa cException asa ca stati pe aproape de ea.
Daca acest articol contine o greseala, selecteaza cuvintele sau fraza gresita si tasteaza combinatia de taste Shift + Enter sau apasa click aici pentru a o raporta. Multumim!
[…] ca functia loadClass() are ca dependenta clasa cException studiata data trecuta pentru tratarea erorilor de genul : fisier , argumente , definirea clasei […]
[…] de baza ce pot fi efectuate asupra unui fisier XML.Aceasta are ca dependenta majora clasa cException, studiata si prezentata in urma cu cateva zile pe […]