Apăsând tragaciul
Până acum am vorbit despre felul în care corectăm erorile generate de PHP, dar de ce să ne oprim aici? PHP vă permite să utilizaţi sistemul sau încorporat de tratare a erorilor pentru a vă crea propriile erori personalizate.
Acest lucru este realizat printr-o funcţie numită trigger_error (), care vă permite să obţineţi oricare din cele trei tipuri de eroare rezervate utilizatorilor: E_USER_NOTICE, E_USER_WARNING şi E_USER_ERROR. Când aceste erori sunt generate, sistemul de corectare inclus în PHP se va declanşa automat pentru a se ocupa de acestea.
<?php
function testNumber($num) {
if (is_float($num)) {
trigger_error("Numarul $num nu este intreg", E_USER_WARNING);
}
if ($num < 0) {
trigger_error("Numarul $num este negativ", E_USER_ERROR);
}
}
testNumber(100);
testNumber(5.6);
testNumber(-8);
?>
Dacă doriţi să aveţi un sistem personalizat de corectare a erorilor care să se ocupe de propriile dvs. erori ... ei bine, sunteţi greu de mulţumit, nu-i asa? Aruncaţi o privire la următorul exemplu, care rescrie scriptul precedent pentru a utiliza un sistem de manipulare a erorilor definit de utilizator:
<?php
function testNumber($num) {
if (is_float($num)) {
trigger_error("Numarul $num nu este intreg", E_USER_WARNING);
}
if ($num < 0) {
trigger_error("Numarul $num este negativ", E_USER_ERROR);
}
}
function myErrorHandler($type, $msg, $file, $line, $context) {
switch ($type) {
case E_USER_WARNING:
print "Eroare care nu este fatala la linia $line din $file: $msg <br />";
break;
case E_USER_ERROR:
die("Eroare fatala la linia $line din $file: $msg <br />");
break;
default:
break;
}
}
set_error_handler("myErrorHandler");
testNumber(100);
testNumber(5.6);
testNumber(-8);
?>
Reţineţi că este responsabilitatea handler-ului personalizat de a apela die() în cazul erorilor fatale generate de utilizator - PHP nu va face acest lucru în mod automat.
Puteţi utiliza aceeaşi metodă şi în cazul excepţiilor, dupa cum se poate vedea in exemplele de mai jos.
Recuperarea
Dacă utilizaţi PHP 5, mai aveţi o alternativă la tehnicile discutate până acum în noul sistem de tratare a exceptiilor (excepţie este echivalent pentru eroare). Excepţiile sunt noi in PHP (deşi au existat în limbaje cum ar fi Java şi Python de foarte mult timp).
În abordarea bazată pe excepţii, codul program este imbricat într-un bloc try(), şi excepţiile generate de acesta sunt "prinse" şi rezolvate printr-un bloc catch(). Pot fi incluse mai multe blocuri catch (), fiecare dintre acestea ocupându-se de un alt tip de eroare; aceasta permite scriptului să prindă diferite tipuri de erori şi să le trateze corespunzător.
Iată cum arată un bloc try-catch() tipic :
try {
executa acest bloc
}
catch (exceptie tip 1) {
executa acest bloc pentru a rezolva exceptia de tip 1
}
catch (exceptie tip 2) {
executa acest bloc pentru a rezolva exceptia de tip 2
}
... si asa mai departe ...
Când PHP întâlneşte un cod imbricat într-un bloc try-catch(), mai întâi încearcă să execute codul din cadrul blocului try(). Dacă acest cod este procesat fără să fie generată vreo excepţie, controlul se transferă liniilor care urmează blocului try-catch(). Cu toate acestea, dacă este generată vreo excepţie în timp ce rulează codul în cadrul blocului try(), PHP opreşte executarea blocului în acel moment şi începe să verifice fiecare bloc catch() pentru a vedea dacă există un handler adecvat excepţiei. În cazul în care este găsit un handler, este executat codul din blocul catch() potrivit; dacă nu, este generată o eroare fatală. Este posibil chiar să trateze acea eroare fatală într-un mod simplu utilizând excepţii; vedeţi http://www.php.net/set-exception-handler pentru mai multe amănunte cu privire la acest aspect.
Excepţiile sunt generate de catre functia throw, care are ca parametri un mesaj descriptiv şi un cod (opţional) al erorii. În cazul în care apare excepţia, această descriere şi codul vor fi puse la dispoziţia handler-ului de excepţii.
Vreţi să vedeţi cum funcţionează? Iată un exemplu:
<?php
error_reporting(0);
try {
$file = 'somefile.txt';
if (!$fh = fopen($file, 'r')) {
throw new Exception('Fisierul nu a putut fi deschis!');
}
if (!$data = fread($fh, filesize($file))) {
throw new Exception(' Fisierul nu a putut fi citit!');
}
fclose($fh);
echo $data;
}
catch (Exception $e) {
print 'A survenit o eroare...';
}
?>
|