Ce face set_exception_handler
Dacă o excepție ajunge până sus fără să fie prinsă, PHP afișează Fatal error: Uncaught ... și oprește scriptul. Cu set_exception_handler pui o funcție de „ultimă șansă”, care poate scrie eroarea în jurnal și poate afișa vizitatorului o pagină prietenoasă.
După ce funcția rulează, scriptul se oprește oricum: nu se mai întoarce în locul unde a apărut excepția. Funcția returnează handler-ul anterior.
Parametri
| Parametru | Descriere |
|---|---|
$callback |
Funcția function (Throwable $e): void. Cu null revii la comportamentul standard. |
Ce returnează
Handler-ul anterior sau null.
Exemple
Exemplul 1: Pagină de eroare prietenoasă
<?php
set_exception_handler(function (Throwable $e): void {
file_put_contents("erori.log", get_class($e) . ": " . $e->getMessage() . "\n", FILE_APPEND);
echo "Ne pare rău, a apărut o problemă. Încearcă din nou peste câteva minute.\n";
});
echo "Încep procesarea comenzii...\n";
throw new RuntimeException("Conexiunea la baza de date a eșuat");
echo "Această linie nu mai rulează.";
Rezultat
Încep procesarea comenzii...
Ne pare rău, a apărut o problemă. Încearcă din nou peste câteva minute.
Exemplul 2: Ce a ajuns în jurnal
<?php
set_exception_handler(function (Throwable $e): void {
file_put_contents("erori.log", get_class($e) . ": " . $e->getMessage() . "\n", FILE_APPEND);
});
register_shutdown_function(function () {
echo "Jurnal:\n" . file_get_contents("erori.log");
});
throw new LogicException("Metoda de plată nu este configurată");
Rezultat
Jurnal:
LogicException: Metoda de plată nu este configurată
Greșeli frecvente
- Folosești handler-ul global în loc de
try/catchpentru erori pe care le poți trata (de exemplu reîncercarea unei conexiuni). Handler-ul global doar raportează; scriptul se oprește. - Pe un site public lași
display_errors=On. Vizitatorii văd căi de fișiere și mesaje interne. Dezactivează-l și folosește jurnalul.
Comenzi înrudite
try / catch / finally / throw: Prinde erorile (excepțiile) apărute într-un bloc de cod, ca scriptul să nu se oprească brusc.Exception: Clasa de bază pentru excepții. Extinde-o ca să creezi tipuri proprii de erori pentru aplicația ta.set_error_handler: Înlocuiește tratarea standard a avertismentelor și notificărilor PHP cu o funcție scrisă de tine.error_log: Scrie un mesaj în jurnalul de erori al serverului sau într-un fișier ales de tine.