Forum und email

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

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:

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(23"foo"5.543.321.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($aM_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:
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().