set_exception_handler în PHP

Setează funcția care rulează când o excepție nu este prinsă de niciun bloc catch.

Sintaxă
set_exception_handler(?callable $callback)

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/catch pentru 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.