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ă
truepentru 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_functioncuerror_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.