set_error_handler în PHP

Erori și excepții PHP 4.0.1+

Înlocuiește tratarea standard a avertismentelor și notificărilor PHP cu o funcție scrisă de tine.

Sintaxă
set_error_handler(?callable $callback, int $error_levels = E_ALL)

Ce face set_error_handler

Avertismentele (E_WARNING), notificările (E_NOTICE), mesajele E_DEPRECATED și erorile generate cu trigger_error nu sunt excepții: PHP le afișează și continuă. Cu set_error_handler le trimiți către funcția ta, care primește tipul erorii, mesajul, fișierul și linia.

Dacă funcția returnează false, PHP rulează și tratarea standard. O tehnică foarte folosită este transformarea avertismentelor în excepții (ErrorException), ca să le poți prinde cu try/catch.

Erorile fatale (de sintaxă, memorie epuizată) nu ajung la această funcție. Funcția returnează handler-ul anterior, iar restore_error_handler() îl readuce. Din PHP 8.5, get_error_handler() spune care este handler-ul activ.

Parametri

Parametru Descriere
$callback Funcția function (int $nivel, string $mesaj, string $fisier, int $linie): bool. Cu null revii la tratarea standard.
$error_levels Opțional. Ce tipuri de erori ajung la funcție, de exemplu E_WARNING | E_NOTICE.

Ce returnează

Handler-ul anterior sau null dacă nu exista unul.

Exemple

Exemplul 1: Funcție proprie pentru avertismente

<?php
set_error_handler(function (int $nivel, string $mesaj, string $fisier, int $linie): bool {
    $tip = match ($nivel) {
        E_WARNING => "Avertisment",
        E_NOTICE, E_USER_NOTICE => "Notificare",
        default => "Eroare $nivel",
    };
    echo "[$tip] $mesaj, linia $linie\n";
    return true;
});

$produse = ["Mouse" => 80];
echo $produse["Tastatură"];
echo $total;
trigger_error("Stocul este aproape epuizat");

Rezultat

[Avertisment] Undefined array key "Tastatură", linia 13
[Avertisment] Undefined variable $total, linia 14
[Notificare] Stocul este aproape epuizat, linia 15

Exemplul 2: Avertismente transformate în excepții

<?php
set_error_handler(function (int $nivel, string $mesaj, string $fisier, int $linie): bool {
    throw new ErrorException($mesaj, 0, $nivel, $fisier, $linie);
});

try {
    $continut = file_get_contents("nu-exista.txt");
} catch (ErrorException $e) {
    echo "Nu am putut citi fișierul:\n" . $e->getMessage();
}

restore_error_handler();

Rezultat

Nu am putut citi fișierul:
file_get_contents(nu-exista.txt): Failed to open stream: No such file or directory

Greșeli frecvente

  • Funcția ta returnează true pentru tot și nu scrie nicăieri mesajul. Toate avertismentele dispar și nu mai afli de probleme.
  • Te aștepți ca handler-ul să prindă și erorile fatale sau excepțiile neprinse. Pentru excepții folosește set_exception_handler; pentru erorile fatale, register_shutdown_function cu error_get_last().

Comenzi înrudite

  • set_exception_handler: Setează funcția care rulează când o excepție nu este prinsă de niciun bloc catch.
  • trigger_error: Generează un mesaj de eroare de nivel utilizator (notificare, avertisment, deprecated), ca cele produse de PHP.
  • error_reporting: Setează ce tipuri de erori raportează PHP (sau doar citește setarea curentă).
  • try / catch / finally / throw: Prinde erorile (excepțiile) apărute într-un bloc de cod, ca scriptul să nu se oprească brusc.