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.
; 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.
<?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.
<?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.
- Bacite RuntimeException s jasnim internim opisom.
- Zapišite detalj u log.
- Korisniku vratite status 500 i generičnu poruku.
Za provjeru i nastavak