set_error_handler

(PHP 4 >= 4.0.1, PHP 5, PHP 7)

set_error_handlerStabilește o funcție definită de utilizator pentru prelucrarea erorilor

Descrierea

set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

Stabilește o funcție a utilizatorului (error_handler) pentru a prelucra erorile într-un script.

Această funcție poate fi utilizată pentru definirea propriului dumneavoastră mod de a prelucra erorile în timpul rulării, spre exemplu în aplicații în care este nevoie de a efectua curățirea datelor / fișierelor atunci când survine o eroare critică, sau când aveți nevoie să declanșați o eroare în anumite circumstanțe (utilizând trigger_error()).

Este important de a ține minte că funcția standardă de prelucrare a erorii a PHP este ocolită complet pentru tipurile de erori specificate în error_types dacă funcția de apel invers nu întoarce FALSE. Setările error_reporting() nu vor avea nici un efect și funcția dumneavoastră de prelucrare a erorii va fi apelată în orice caz - însă puteți totuși citi valoarea curentă a error_reporting și să acționați corespunzător. Merită de menționat că această valoare va fi 0 dacă instrucțiunea care a cauzat eroarea a fost prefixată cu operatorul de control al erorii @.

De asemenea observați ca este responsabilitatea dumneavoastră să efectuați die() dacă este necesar. Dacă funcția de prelucrare a erorii întoarce controlul execuției, execuția scriptului continuă cu următoarea instrucțiune după acea care a cauzat eroarea.

Următoarele tipuri de erori nu pot fi prelucrate de o funcție definită de utilizator: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING și majoritatea E_STRICT ce survin în fișier, unde set_error_handler() este apelat.

Dacă erorile survin înainte de execuția script-ului (de ex. la încărcarea fișierelor), funcțiile proprii de prelucrare a erorilor nu pot fi apelate, deoarece încă nu sunt înregistrate la acel moment.

Parametri

error_handler

O funcție de apel invers cu următoarea semnătură NULL poate fi transmisă pentru a restabili acest handler la starea sa implicită. În loc de denumirea funcției, un tablou ce conține o referință la obiect și denumirea metodei pot fi furnizate.

handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
errno
Primul parametru, errno, conține nivelul erorii (tip integer).
errstr
Al doilea parametru, errstr, conține mesajul de eroare (tip string).
errfile
Al treilea parametru opțional, errfile, conține denumirea fișierului în care a avut loc eroarea (tip string).
errline
Al patrulea parametru opțional, errline, conține numărul liniei unde a avut loc eroarea (tip integer).
errcontext
Al cincilea parametru opțional, errcontext, este un tablou ce indică spre tabelul de simboluri activ la momentul când a avut loc eroarea. Cu alte cuvinte, errcontext va conține un tablou cu toate variabilele ce au existat în contextul în care s-a produs eroarea. Funcția de prelucrare a erorii definită de utilizator nu trebuie să modifice contextul erorii.

Dacă funcția întoarce FALSE, atunci funcția normală de gestiune a erorii continuă.

error_types

Poate fi utilizat pentru a masca declanșarea funcției error_handler în mod asemănător cum setarea ini error_reporting controlează care erori sunt afișate. Fără această mască stabilită error_handler va fi apelată la orice eroare, indiferent de setările error_reporting.

Valorile întoarse

Întoarce un string conținând funcția de prelucrare a erorii definită anterior (dacă există). Dacă se utilizează funcția implicită de prelucrare a erorii, va fi întors NULL. NULL este întors de asemenea și în cazul unei erori, cum ar fi o funcție de prelucrare a erorii invalidă. Dacă funcția precedentă de prelucrare a erorii era o metodă a unei clase, această funcție va întoarce un tablou indexat, incluzând clasa și denumirea metodei.

Istoricul schimbărilor

Versiune Descriere
5.5.0 error_handler acum acceptă NULL.
5.2.0 Funcția de prelucrare a erorii trebuie să întoarcă FALSE pentru a popula $php_errormsg.

Exemple

Example #1 Controlul erorilor cu set_error_handler() și trigger_error()

Exemplul ce urmează demonstrează prelucrarea excepțiilor interne prin generarea erorilor și prelucrarea lor cu ajutorul unei funcții definite de utilizator:

<?php
// Funcția de prelucrare a erorilor
function myErrorHandler($errno$errstr$errfile$errline)
{
    if (!(
error_reporting() & $errno)) {
        
// Acest cod de eroare nu este inclus în error_reporting
        
return;
    }

    switch (
$errno) {
    case 
E_USER_ERROR:
        echo 
"<b>My ERROR</b> [$errno$errstr<br />\n";
        echo 
"  Fatal error on line $errline in file $errfile";
        echo 
", PHP " PHP_VERSION " (" PHP_OS ")<br />\n";
        echo 
"Aborting...<br />\n";
        exit(
1);
        break;

    case 
E_USER_WARNING:
        echo 
"<b>My WARNING</b> [$errno$errstr<br />\n";
        break;

    case 
E_USER_NOTICE:
        echo 
"<b>My NOTICE</b> [$errno$errstr<br />\n";
        break;

    default:
        echo 
"Unknown error type: [$errno$errstr<br />\n";
        break;
    }

    
/* Nu executa funcția internă a PHP de prelucrare a erorii */
    
return true;
}

// Funcție pentru a verifica prelucrarea erorilor
function scale_by_log($vect$scale)
{
    if (!
is_numeric($scale) || $scale <= 0) {
        
trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale"E_USER_ERROR);
    }

    if (!
is_array($vect)) {
        
trigger_error("Incorrect input vector, array of values expected"E_USER_WARNING);
        return 
null;
    }

    
$temp = array();
    foreach(
$vect as $pos => $value) {
        if (!
is_numeric($value)) {
            
trigger_error("Value at position $pos is not a number, using 0 (zero)"E_USER_NOTICE);
            
$value 0;
        }
        
$temp[$pos] = log($scale) * $value;
    }

    return 
$temp;
}

// Se stabilește funcția de prelucrare a erorilor definită de utilizator
$old_error_handler set_error_handler("myErrorHandler");

// declanșăm unele erori, în primul rând definim un tablou mixt cu un element non-numeric
echo "vector a\n";
$a = array(23"foo"5.543.321.11);
print_r($a);

// acum generăm următorul tablou
echo "----\nvector b - a notice (b = log(PI) * a)\n";
/* Valoarea din poziția $pos nu este un număr, se va utiliza 0 (zero) */
$b scale_by_log($aM_PI);
print_r($b);

// aici este o problemă: se transmite un string în loc de un array
echo "----\nvector c - a warning\n";
/* Vector de intrare incorect, se așteaptă un tablou de valori */
$c scale_by_log("not array"2.3);
var_dump($c); // NULL

// aceasta este o eroare critică, logaritmul lui zero, sau a unui număr negativ este nedefinit
echo "----\nvector d - fatal error\n";
/* log(x) pentru x <= 0 nu este definit, ați utilizat: scale = $scale" */
$d scale_by_log($a, -2.5);
var_dump($d); // Niciodată nu se ajunge aici
?>

Exemplul de mai sus va afișa ceva similar cu:

vector a
Array
(
    [0] => 2
    [1] => 3
    [2] => foo
    [3] => 5.5
    [4] => 43.3
    [5] => 21.11
)
----
vector b - a notice (b = log(PI) * a)
<b>My NOTICE</b> [1024] Value at position 2 is not a number, using 0 (zero)<br />
Array
(
    [0] => 2.2894597716988
    [1] => 3.4341896575482
    [2] => 0
    [3] => 6.2960143721717
    [4] => 49.566804057279
    [5] => 24.165247890281
)
----
vector c - a warning
<b>My WARNING</b> [512] Incorrect input vector, array of values expected<br />
NULL
----
vector d - fatal error
<b>My ERROR</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br />
  Fatal error on line 35 in file trigger_error.php, PHP 5.2.1 (FreeBSD)<br />
Aborting...<br />

A se vedea și