<?> PHP NOVA invictum.hr
Izdanje 2026.
Poglavlje 20

Pogreške i iznimke

Pogreške činimo vidljivima razvojnom timu, a korisniku vraćamo siguran i razumljiv odgovor bez curenja detalja.

24 min čitanja Srednje razina PHP 8.5 ciljna verzija

Nakon ovog poglavlja

Što ćete znati napraviti

  • Razlikovati razvojni prikaz pogreške od produkcijskog logiranja.
  • Baciti, uhvatiti i povezati iznimku na pravoj razini.
  • Uvesti globalni rukovatelj kao zadnju sigurnosnu mrežu.

Vidljivost bez curenja

Detalji za razvoj, generična poruka za javnost

U razvoju želimo stack trace, datoteku i redak. U produkciji display_errors treba biti isključen, a pogreška zapisana u zaštićen log ili sustav nadzora. Korisnik dobiva korelacijski identifikator kojim podrška može pronaći događaj.

Log ne smije sadržavati lozinke, tokene, cijela tijela osjetljivih zahtjeva ni nepotrebne osobne podatke.

php.ini pristup
; razvoj
display_errors = On
error_reporting = E_ALL

; produkcija
display_errors = Off
log_errors = On

Neuspjeh ima značenje

Bacite iznimku kada operacija ne može ispuniti ugovor

Iznimka prekida normalni tok dok je odgovarajuća razina ne obradi. Uhvati je sloj koji može smisleno reagirati: ponoviti rad, prevesti je u HTTP odgovor ili obogatiti kontekst. Prazan catch blok skriva kvar.

Prevođenje u HTTP odgovor
<?php

try {
    $article = $repository->findOrFail($id);
} catch (ArticleNotFound $exception) {
    http_response_code(404);
    echo 'Članak nije pronađen.';
} catch (Throwable $exception) {
    error_log($exception->getMessage());
    http_response_code(500);
    echo 'Dogodila se neočekivana pogreška.';
}

Zadnja zaštita

Jedno mjesto za neočekivane iznimke

Globalni handler osigurava dosljedan status i poruku ako iznimka dođe do ulazne točke. Ne zamjenjuje lokalno rješavanje očekivanih problema. Handler treba pokušati zapisati događaj, ali i sam ostati jednostavan kako ne bi proizveo novu pogrešku.

Ulazna točka aplikacije
<?php

set_exception_handler(static function (Throwable $exception): void {
    $incident = bin2hex(random_bytes(8));
    error_log("[{$incident}] {$exception}");

    http_response_code(500);
    echo "Neočekivana pogreška. Oznaka: {$incident}";
});

Primijenite naučeno

Vježba: Siguran neuspjeh

Napravite stranicu koja pokušava učitati nepostojeći JSON i vraća kontrolirani odgovor.

  1. Bacite RuntimeException s jasnim internim opisom.
  2. Zapišite detalj u log.
  3. Korisniku vratite status 500 i generičnu poruku.

Za provjeru i nastavak

Službeni izvori