Descriere
string
set_error_handler ( string error_handler)
Setează o funcție utilizator (error_handler) pentru gestionarea
erorilor într-un script. Returnează funcția anterioară de gestiune (dacă există),
sau FALSE în cazul unei erori. Această funcție vă permite definirea propriului mod
de tratare a erorilor la execuție, de exemplu în aplicații în care
este nevoie de refacerea unor date/fișiere când apare o eroare critică,
sau este necesară declanșarea unei erori dacă sunt îndeplinite anumite condiții
(folosind trigger_error()).
Funcția definită de utilizator trebuie să accepte doi parametri: codul de eroare
și un șir de caractere care descrie eroarea. Începând cu versiunea PHP 4.0.2 sunt
acceptați încă trei parametri opționali: numele fișierului în care a apărut eroarea,
numărul liniei la care s-a produs această eroare și contextul în care ea a apărut
(un tablou care indică tabela de simboluri activă în punctul în care a apărut eroarea).
Mai jos este exemplificată tratarea unei excepții interne prin declanșarea erorilor
și tratarea lor cu o funcție definită de utilizator:
Exemplu 1.
Tratarea erorilor cu ajutorul funcțiilor set_error_handler() și
trigger_error()
<?php // redefinirea constantelor de eroare - doar în PHP 4 define ('FATAL', E_USER_ERROR); define ('ERROR', E_USER_WARNING); define ('WARNING', E_USER_NOTICE);
// setarea nivelului de raportare a erorilor pentru acest script error_reporting(FATAL | ERROR | WARNING);
// funcția de tratare a erorilor function myErrorHandler ($errlevel, $errstr, $errfile, $errline) { switch ($errlevel) { case FATAL: echo "<b>FATAL</b> [$errlevel] $errstr<br>\n" . " Eroare fatala la linia $errline in fisierul $errfile," " PHP " . PHP_VERSION . " (" . PHP_OS . ")<br>\n"; "Abandon...<br>\n"; exit(1); break; case ERROR: echo "<b>ERROR</b> [$errlevel] $errstr<br>\n"; break; case WARNING: echo "<b>WARNING</b> [$errlevel] $errstr<br>\n"; break; default: echo "Eroare de tip necunoscut: [$errlevel] $errstr<br>\n"; break; } }
// funcție pentru testarea tratării erorilor function scale_by_log ($vect, $scale) { if (!is_numeric($scale) || $scale <= 0) { trigger_error("log(x) pentru x <= 0 nu este definita, ati folosit: scale = $scale", FATAL); } if (!is_array($vect)) { trigger_error("Tablou de intrare incorect, trebuia un tablou de valori", ERROR); return null; } for ($i = 0; $i < count($vect); $i++) { if (!is_numeric($vect[$i])) { trigger_error("Valoarea de la pozitia $i nu este un numar, se va folosi 0 (zero)", WARNING); } $temp[$i] = log($scale) * $vect[$i]; } return $temp; }
// setarea gestionarului de erori definit de utilizator $old_error_handler = set_error_handler("myErrorHandler");
// se definește un tablou cu un element non-numeric // și se declanșează eroare echo "tablou a<pre>\n"; $a = array(2, 3, "foo", 5.5, 43.3, 21.11); print_r($a); echo "</pre>";
// se generează al doilea tablou și se declanșează o avertizare echo "----<br>\ntablou b - o atentionare (b = log(PI) * a)\n<pre>"; $b = scale_by_log($a, M_PI); print_r($b); echo "</pre>";
// se transmite un șir de caractere în loc de un tablou echo "----<br>\ntablou c - eroare\n<pre>"; $c = scale_by_log("nu este tablou", 2.3); var_dump($c); echo "</pre>\n";
// o eroare critica: nu este definit log() pentru zero sau numere negative echo "----<br>\ntablou d - eroare fatala\n"; $d = scale_by_log($a, -2.5); ?>
|
|
Rularea script-ului va produce:
Este important de reținut că gestionarul standard PHP al erorilor va fi ignorat
complet. Setările efectuate de error_reporting() nu vor mai avea
nici un efect și va fi apelată doar funcția definită de utilizator. Se poate citi în
continuare valoarea curentă setată de error_reporting() pentru folosire
adecvată. Trebuie făcută mențiunea că această valoare va fi zero dacă instrucțiunea
care a generat eroarea este precedată de
operatorul @ de control a erorilor.
De asemenea, trebuie precizat că este responsabilitatea programatorului să apeleze funcția
die() dacă este necesar. Dacă funcția de tratare a erorii nu întrerupe
explicit execuția, scriptul va continua cu instrucțiunea următoare celei care a generat eroarea.
Mai consultați error_reporting(),
restore_error_handler(),
trigger_error(), user_error().