set_error_handler
(PHP 4 >= 4.0.1, PHP 5)
set_error_handler — Setează o funcţie de tratare a erorilor definită de utilizator
Descriere
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:
Example#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);
?>
tablou a Array ( [0] => 2 [1] => 3 [2] => foo [3] => 5.5 [4] => 43.3 [5] => 21.11 ) ---- tablou b - o atentionare (b = log(PI) * a) WARNING [1024] Valoarea de la pozitia 2 nu este un numar, se va folosi 0 (zero) Array ( [0] => 2.2894597716988 [1] => 3.4341896575482 [2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 24.165247890281 ) ---- tablou c - eroare ERROR [512] Tablou de intrare incorect, trebuia un tablou de valori NULL ---- tablou d - eroare fatala FATAL [256] log(x) pentru x <= 0 nu este definita, ati folosit: scale = -2.5 Eroare fatala la linia 37 in fisierul /softure/htdocs/test.php, PHP 4.0.6 (Linux) Abandon... 1
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().