Nápad – Kontrolované a nekontrolované výjimky v PHP (Nette)
- stekycz
- Člen | 152
V posledních pár týdnech jsem hodně v kontaktu s Javou (bohužel). Tamější princip kontrolovaných a nekontrolovaných výjimek znám již delší dobu, ale nedávno mě napadlo, zda by to bylo možné nějak aplikovat pro Nette nebo PHP vůbec.
Sepíšu sem nějaké vlastní postřehy a budu rád, pokud se k tomu také někdo vyjádří a případně mě zbrzdí, zda nevymýšlím hovadiny :-)
Postřehy k tématu
- Není kompilátor, takže bohužel bychom mohli kontrolovat jen za běhu. Případně nějakou statickou analýzou kódu při prvním načtení Nette, ve stejnou dobu jako se zpracovává konfigurace.
- Neexistuje označení vyhazované výjimky přímo PHP syntax, takže
řešení opět přes anotace. Alespoň že
@throws
je normální PHPDoc :-) - Nejsem si ještě úplně jistý tím, které výjimky by měly být Runtime a které Checked. Chci si rozkreslit strom výjimek v PHP a v Nette a pak zkusím něco navrhnout.
- Trochu problém by asi byl při dědění metod nebo jejich volání jinými metoda (a třeba i jiné třídy).
A k čemu se to může hodit?
- Používám cizí (nebo klidně i svojí) knihovnu, která občas vyhodí výjimku. Tu ale mohu zpracovat a ošetřit. Pokud pracuju se svojí knihovnou, tak o výjimce asi vědět budu. Pokud ale pracuju s cizí (např. Nette :-)), tak se může stát, že někde hluboko uvnitř vyhodí výjimku, kterou nemohu čekat a kterou bych mohl ošetřit. Prostě ve veřejném rozhraní není uvedena, protože daná věřejná metoda sama výjimku nevyhazuje. Sniží mi to tedy WTF faktor, když mi na produkčním serveru vypadne naprosto jednoduchá výjimka a vlastně pořádně nevím proč.
- Zlepšení PHPDoců týkajících se vyhazovaných výjimek :-)
A jak by to teda mělo vlastně ve výsledku fungovat?
Pokud jsem v development módu a v průběhu volání kódu se dostanu na
metodu, která výjimku může vyhodit (z nějakého vlastního volání), tak
mi Nette vyhodí nekontrolovanou výjimku, že mi někde chybí označení
kontrolované výjimky. V produkci by se to mohlo chovat jako doposud.
Problém samozřejmě může nastat při použití naprosto cizí (ne Nette)
knihovny. V takovém případě bych si měl sám stejně udělat nějaký
vlastní model/wrapper nad touto knihovnou, ve kterém si výjimky nějak
označím (třeba @throws Exception
, ale asi by to šlo
i lépe).
Je to možná příliš striktní a do PHP se to nehodí, ale chtěl bych tímto vyvolat diskuzi, jaké máte kdo na to názory :-)
- Filip Procházka
- Moderator | 4668
Moc pěkná pohádka. Ale nedokážu si to představit. Zkus napsat prototyp :)
Editoval HosipLan (11. 8. 2012 10:42)
- redhead
- Člen | 1313
Četl jsem teď v jedné výborné
knize, že právě kontrolované výjimky jsou často přítěží.
Hlavně v tom, že pokud se změní nebo přidá výjimka v metodě někde na
20. levelu call stacku, bude se muset všude na 19 místech (a často
i někde jinde, odkud se metoda volá) doplnit throws
. To činí
z refaktorování noční můru. V Javě se ti rozsvítí všechna místa
s chybou červeně a máš možnost procházet kód a opravit ho (nebo
s pomocí refaktorovacích nástrojů IDE), za to v PHP si to neumím
představit.
Už jenom to, že třeba někde změním pořadí volání při refaktoru, nastanou dvě možnost:
- jako uvědomělý budu muset zkoumat kód, jak se co kde volá a upravovat podle toho PHPDoc
- zapomenu na nějaké komentáře a bude z toho katastrofa
Bylo by to výborné, kdyby PHP mělo kompilaci a přímou podporu pro syntaxi. Za mě tedy ne.