Laravel 08.09.2026 · 1 min čitanja

catch (Exception $e) ne hvata sve: kako nam je upload tiho umirao

PHP baca i Error, ne samo Exception — a catch (Exception) ga propušta. Kako je nadogradnja biblioteke pretvorila svaki upload u 500 bez ijednog zapisa, i što smo naučili iz lažnog nalaza koji je do toga doveo.

Sigurnosni pregled Laravel aplikacije prijavio je kritičan nalaz: daljinsko izvršavanje koda u obradi priloga. Nalaz je bio pogrešan. Ono što smo pronašli dok smo ga opovrgavali bilo je gore na svoj tihi način — svaki upload je padao, a nitko nije znao.

Dva stabla, jedan catch

Od PHP-a 7 postoje dva odvojena stabla onoga što se može baciti: Exception za očekivane greške i Error za programske — poziv nepostojeće metode, kriv tip, iscrpljena memorija. Zajednički im je samo Throwable. Blok catch (Exception $e) hvata isključivo prvo stablo; Error prolazi kroz njega kao da ga nema.

Kako je upload umro

Pomoćna klasa za metapodatke zvala je metodu biblioteke za datoteke koja je u novijoj verziji uklonjena. Poziv nepostojeće metode baca Error. Kontroler je oko obrade priloga imao uredan catch (Exception) s porukom korisniku — koji Error nikad nije ni vidio. Rezultat: 500 na svakom uploadu, bez zapisa u aplikacijskom logu, bez poruke korisniku. Prijave s prilozima jednostavno su nestajale.

Lažni nalaz koji nas je doveo do pravog

Ista klasa je nekoliko redaka niže imala poziv koji sastavlja naredbu ljuske — na papiru udžbenički primjer daljinskog izvršavanja koda. Pregled ga je tako i ocijenio. Ali linija je bila mrtva: do nje se nikad nije stizalo, jer je upravo onaj Error par redaka iznad svaki put prekidao izvršavanje. Pouka koju smo zapisali: dohvatljivost se dokazuje redak po redak, ne praćenjem poziva do funkcije.

Što smo promijenili

Mrtvi kod je uklonjen, pomoćna klasa prepisana bez sastavljanja naredbi. Na granicama sustava — tamo gdje kontroler odlučuje što korisnik vidi — hvatamo Throwable, ne Exception, i svaki takav slučaj prijavljujemo u log prije nego što vratimo odgovor. Hvatanje svega nije lijek za loš kod, ali jamči da se kvar barem vidi. Tiho umiranje je najgori način umiranja.

Greška koju nitko ne vidi nije riješena — samo je premještena korisniku.