E-learn.ro
Panou utilizatori
Utilizator Parola
Creeaza cont nou    Recupereaza parola
Login
Newsletter
Introdu adresa ta de email
Inscrie-te
Inchide panoul de utilizatori
Add to Google

Tutoriale PHP

Descarca toolbar

Toolbar E-learn.ro Facebook Twitter

WEB DEVELOPMENT  /  PHP  /  Introducere in PHP (24)

XII. "Enervand" virusii (partea a II-a)

03.11.2008
XII.

PHP iti permite sa folosesti sistemul sau incorporat cu ajutorul caruia poti genera propriile erori.

Total vizualizari: 3917 3917 afisari   |   Comentarii  0   |   Rating   |   (1 vot)   |   Timp necesar: 25 min 25 min   |   Nivel de cunostiinte necesar: Mediu  Mediu

Sursa:  Devzone.zend.com  
Autor:  Vikram Vaswani
Adauga la tutoriale favorit Adauga la tutoriale favorite
Pagina:
« 1 2
comenteaza printeaza

Dacă fişierul nu există, sau nu poate fi citit, funcţia throw va genera o excepţie (în esenţă, o instanţă a clasei Exception) şi îi furnizează un mesaj care descrie eroarea. Atunci când este generată o astfel de excepţie, controlul trece la primul bloc catch(). În cazul în care blocul catch() se poate ocupa de tipul de excepţie respectiv, este executat codul din interiorul său. În cazul în care primul bloc catch() nu poate mânui excepţia generată, controlul trece la următorul bloc catch().

Nu vă faceţi prea multe griji cu privire la "tipurile de excepţii" în acest moment - toate vor fi explicate în curând. Pentru moment, tot ce trebuie să ştiţi este că blocul generic catch() de mai sus va prinde toate excepţiile, indiferent de tipul acestora.

Există o problema cu secvenţa precedentă. Deşi blocul catch() va captura excepţia şi va afişa un mesaj, nu poate afişa mesajul descriptiv trimis de către funcţia throw în acelaşi timp cu excepţia. Pentru a avea acces la acest mesaj, precum şi la o serie de alte informaţii interesante, este necesar să utilizăm o parte din metodele predefinite ale clasei Exception. Aruncaţi o privire la această revizuire a scriptului precedent:

<?php 
// PHP 5 
 
error_reporting(0); 
 
// incearca acest cod 
try { 
    $file = 'somefile.txt'; 
 
    // deschide fisier 
    if (!$fh = fopen($file, 'r')) { 
        throw new Exception('Fisierul nu a putut fi deschis!', 12); 
    } 
 
    // citeste continutul fisierului 
    if (!$data = fread($fh, filesize($file))) { 
        throw new Exception('Fisierul nu a putut fi citit!', 9); 
    } 
 
    // inchide fisier
    fclose($fh); 
 
    // afiseaza continutul fisierului
    echo $data; 
} 
// captureaza posibilele erori 
catch (Exception $e) { 
    print '<h2>Exceptie</h2>'; 
    print 'Mesaj eroare: ' . $e->getMessage() . '<br />'; 
    print 'Cod eroare: ' . $e->getCode() . '<br />'; 
    print 'Fisier si linie: ' . $e->getFile() . '(' . $e->getLine() . ')<br />'; 
    print 'Urmarire: ' . $e->getTraceAsString() . '<br />'; 
} 
 
?>

Când veţi executa acest script, veţi vedea că mesajul generat de către handler-ul de excepţii conţine:

  • datele descriptive trimise de throw,
  • un cod de eroare (trimis de asemenea de către throw),
  • numele fişierului şi numărul liniei unde a apărut excepţia, şi
  • un tabel detaliat indicând progresul excepţiei prin ierarhia clasei, în cazul în care acesta există.
     

Aceste informaţii sunt generate prin apelarea metodelor clasei Exception: getMessage(), getCode(), getFile(), getLine() şi getTraceAsString(), respectiv in blocul catch().

Adăugăm puţină clasă

Puteţi să vă ocupaţi de diverse excepţii prin diferite metode, prin mostenirea clasei generice Exception şi prin utilizarea mai multor blocuri catch(). Următorul exemplu este o simplă ilustrare a acestui aspect:

<?php 
// PHP 5 
 
// mostenirea clasei Exception
class NegativeNumException extends Exception {} 
class OutOfRangeException extends Exception {} 
class FloatException extends Exception {} 
 
// functie pentru testarea unui numar 
function testNumber($num) { 
    // float 
    // declanseaza un avertisment 
    if (is_float($num)) { 
        throw new FloatException($num); 
    } 
 
    // negativ 
    // arunca o exceptie 
    if ($num < 0) { 
        throw new NegativeNumException($num); 
    } 
 
    // in afara intervalului
    // arunca o exceptie 
    if ($num > 1000 || $num < 100) { 
        throw new OutOfRangeException($num); 
    } 
} 
 
// incearca acest cod 
try { 
    testNumber(-19); 
} 
 
// prinde posibilele erori 
catch (NegativeNumException $e) { 
    print 'A fost furnizat un numar negativ ('.$e->getMessage().'). Va rugam sa furnizati un intreg aflat intre 100 si 1000.<br />'; 
} 
catch (OutOfRangeException $e) { 
    print 'Numarul oferit este in afara intervalului ('.$e->getMessage().'). Va rugam sa furnizati un intreg pozitiv aflat intre 100 si 1000.<br />'; 
} 
catch (FloatException $e) { 
    print 'Numarul oferit nu este un intreg ('.$e->getMessage().'). Va rugam sa furnizati un intreg pozitiv aflat intre 100 si 1000.<br />'; 
} 
catch (Exception $e) { 
    print 'Mesaj de eroare: ' . $e->getMessage() . '<br />'; 
    print 'Cod de eroare: ' . $e->getCode() . '<br />'; 
    print 'Fisier si linie: ' . $e->getFile() . '(' . $e->getLine() . ')<br />'; 
    print 'Urmarire: ' . $e->getTraceAsString() . '<br />'; 
} 
 
?>

În acest caz, am creat trei noi subclase Exception din mostenirea clasei de bază, câte una pentru fiecare posibilă eroare. Apoi, am creat blocuri catch(), pentru fiecare tip de excepţie, şi codul scris de manipulare specific fiecărui tip de excepţie. În funcţie de excepţia apărută (puteţi genera diferite excepţii, prin trimiterea de valori diverse funcţiei testNumber() ), blocul potrivit catch() va fi invocat şi un mesaj diferit de eroare va fi tipărit.

Reţineţi că, deoarece PHP va folosi întotdeauna primul bloc catch() care se potriveşte tipului de excepţie, şi deoarece clasa generică Exception se potriveşte tuturor excepţiilor, blocurile catch() trebuie să fie aranjate în ordine, primul fiind cel mai specific. Acest lucru a fost realizat în exemplul de mai sus, unde blocul generic catch() apare ultimul pe listă.

Iată un alt exemplu, acesta ilustrând o aplicaţie mai utilă – utilizând modelul de excepţie într-o clasă de autentificare a utilizatorului pentru a furniza o modalitate de manevrare a erorilor uşor de înţeles. Aruncaţi o privire:

<?php 
// PHP 5 
 
// definiti clasa 
class userAuth { 
    // definiti proprietatile 
    private $username; 
    private $passwd; 
    private $passwdFile; 
 
    // constructor 
    // trebuie sa se introduca un utilizator si o parola necriptata  
    public function __construct($username, $password) { 
            $this->username = $username; 
            $this->passwd = $password; 
    } 
 
    // setati fisierul tip .htaccess pentru a verifica parolele 
    public function setPasswdFile($file) { 
        $this->passwdFile = $file; 
    } 
 
    // executati verificarea parolei 
    public function authenticateUser() { 
        // verifica daca exista fisierul
        if (!file_exists($this->passwdFile)) { 
            throw new FileException("Fisierul cu parole nu poate fi gasit: " . $this->passwdFile); 
        } 
 
        // verifica daca fisierul poate fi citit 
        if (!is_readable($this->passwdFile)) { 
            throw new FileException("Nu se poate citi din fisierul cu parole: ". $this->passwdFile); 
        } 
 
        // citeste fisier 
        $data = file($this->passwdFile); 
     
        // parcurge fisierul 
        foreach ($data as $line) { 
            $arr = explode(":", $line); 
            // daca se potriveste utilizatorul, testati parola 
            if ($arr[0] == $this->username) { 
                // apeleaza crypt(), presupunand criptarea 
                $salt = substr($arr[1], 0, 2); 
 
                // daca se potriveste, combinatia utilizator/parola este corecta 
                if ($arr[1] == crypt($this->passwd, $salt)) { 
                    echo "Utilizatorul a fost autentificat"; 
                    // executa cod suplimentar 
                } 
                // daca nu, genereaza exceptia 
                else { 
                    throw new AuthException("Parola incorecta"); 
                    break; 
                } 
            } 
            else { 
                // nu a putut fi gasita o potrivire a userului 
                // arunca exceptia
                throw new AuthException("Nu exista acest utilizator"); 
            } 
        } 
    } 
// incheie definirea clasei 
} 
 
// exceptii subclasa
class FileException extends Exception {}; 
class AuthException extends Exception {}; 
 
// incearca codul 
try { 
    // creeaza exemplu
    $ua = new userAuth("joe", "secret"); 
 
    // seteaza fisier parola 
    $ua->setPasswdFile("parola.txt"); 
 
    // executa autentificarea
    $ua->authenticateUser(); 
 
} 
// capteaza esecurile de autentificare, daca exista 
catch (FileException $e) { 
    // a survenit o eroare in fisier 
    print "S-a produs o eroare in fisier. ".$e->getMessage(); 
} 
catch (AuthException $e) { 
    // a aparut o eroare de autentificare 
    print "A aparut o eroare de autentificare. ".$e->getMessage(); 
    // in mod normal, redirectioneaza catre o noua pagina de ex. cu erori de autentificare 
    // header ('Localizare: login_fail.php'); 
} 
catch (Exception $e) { 
    print "A aparut o eroare necunoscuta"; 
} 
 
?>

Aici, în funcţie de tipul de eroare, va fi generat fie FileException() sau AuthException() - şi va fi tratată de blocul catch() corespunzător. Observaţi cât de uşor se citeşte şi se extinde schema de manipulare a excepţiilor. Exact această uşurinţă în utilizare şi extensibilitate ajută noul model PHP 5 să fie avantajat în faţa tehnicilor de manevrare a erorilor mai vechi, mai primitive.

Ei bine, cam asta este tot pentru moment. Reveniţi în curând repede, pentru a citi mai multe tutoriale din seria PHP 101!

Pagina:
« 1 2
comenteaza printeaza
Alte tutoriale PHP:
Noteaza acest tutorial
Rating tutorial
 
(1 voturi)
Pentru a nota acest tutorial, trebuie sa fii logat!
Posteaza un comentariu
Pentru a posta un comentariu, trebuie sa fii logat!
0 TOP UTILIZATORI* 0 0
Tutoriale scrise de claibornelara
claibornelara Rang utilizator claibornelara - Incepator
4335
Tutoriale scrise de mcuemica
mcuemica Rang utilizator mcuemica - Incepator
4200
Tutoriale scrise de ellarichards
ellarichards Rang utilizator ellarichards - Incepator
4185
Tutoriale scrise de kheops
kheops Rang utilizator kheops - Mediu
4084
Tutoriale scrise de emonclercheap
emonclercheap Rang utilizator emonclercheap - Incepator
4020
* Acest top reprezinta punctajele acumulate in ultimele 30 de zile.
COREL DRAW Illustrator MySQL JSON Outlook HTML RoR CSS Word Python AJAX Fireworks Verilog Ruby on Rails Excel Flash Swift 3D Dreamweaver StyleSheet Javascript Action Script Fotografie PHP SWF Java Gimp XHTML Powerpoint SEO Bridge Sony Vegas Vista Lightroom PSD XML Photoshop
Promovare:
Daca faci parte din comunitatea E-learn.ro si doresti promovarea acesteia, poti accesa pagina de promovare.
Arhiva newsletter:
Daca ai ratat un numar mai vechi, sau vrei sa revezi care au fost noutatile E-learn.ro la un moment dat, poti accesa arhiva de newslettere.
  Copyright © 2008-2013 E-LEARN.ro. Toate drepturile rezervate. Termeni si conditii.
Conceput si realizat de Neokinetics Software