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:

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:

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().