Výjimky v Nette Framework 2.0
- Ondřej Mirtes
- Člen | 1536
David mě požádal, abych zkusil vymyslet koncepci výjimek v novém Nette. Narazil jsem na inspirativní článek a řekl si, že takhle by to šlo.
Je vlastně důvod něco měnit? V současnosti je v Nette ve výjimkách bordel. V exceptions.php se definuje spousta výjimek bez namespace, které jsou pak ve frameworku hojně využívány. Mimo toho jsou ale využívány i některé výjimky z SPL (dokonce ani z hlavy nedokážu říct, které jsou které, což je argument samo o sobě).
- Nette by mělo definovat výjimky pouze ve svém namespace. Kvůli tomu existují, aby knihovny nezasahovaly do globálního namespace a nedocházelo ke konfliktům. Navíc je to další WTF, které mi muselo být několikrát vysvětlováno („Proč má Nette všechno ve svém namespace, až na tyto výjimky? :o)“).
- Líbí se mi přístup popsaný v tom článku. Dědit frameworkové výjimky od standardních výjimek z SPL, ať se dají pohodlně a jednotně zachytávat. Tyto výjimky se dělí do třech skupin: dynamic call, logic a runtime.
Dynamic call
Tyto výjimky by měly být vyhazovány v magických __call metodách a všude, kde se narazí na neplatný callback.
- LogicException
- BadFunctionCallException
- BadMethodCallException
Logic
Pokud nám do metody přijde neplatný argument.
- LogicException
- DomainException
- InvalidArgumentException
- LengthException
- OutOfRangeException
Runtime
Pokud nastane situace, kterou nelze zachytit pomocí kontroly argumentů a objekt se dostane do invalidního stavu.
- RuntimeException
- OutOfBoundsException
- OverflowException
- RangeException
- UnderflowException
- UnexpectedValueException
Určitě bych v Nette od těchto výjimek dědil a vytvářel výjimky s popisnějšími názvy, aby to vedlo k velké granularitě a tudíž jemnému zachytávání.
- Jelikož při tomto způsobu nelze dědit od obecné Nette\Exception, ale přesto by se mohla hodit, můžeme aplikovat něco, čemu se říká Marker interface a z Nette\Exception udělat rozhraní. Je to doporučená cesta v odkazovaném článku a to samé obsahuje i PEAR2 RFC.
Ad zpětná kompatibilita – pokud někdo hojně využívá současné nenamespacované výjimky z Nette, které se přesunou pod namespace a změní se jim předek, může si je nadefinovat znova ve své aplikaci.
- jtousek
- Člen | 951
Výjímky v Nette mě také od začátku zarážely tím, že je polovina v exceptions.php bez namespace a druhá různě rozházená po celém frameworku a s namespace.
Rozhodně jsem pro navrhované změny, nějaké rozhraní Nette\IException nebo Nette\INetteException je rozhodně také dobrý nápad.
––zbytek smazán, dg––
Editoval jtousek (2. 10. 2010 14:05)
- Majkl578
- Moderator | 1364
jtousek napsal(a):
@Majkl578: …
Už teď mi běhá mráz po zádech při pomyšlení na to jak se David postaví k PHP 5.4. To zas Nette\Object nebude traitou další 3 roky, kterou by být měl… O dalších novinkách nemluvě – array dereferencing, JsonSerializable, podpora $this v Closurách atd. :(
––nesmazáno, vtipné. dg.––
- Patrik Votoček
- Člen | 2221
Než se to tu úplně zvrhne v něco co s tímto RFC moc nesouvisí tak diskuse o zrušení 5.2 zde https://forum.nette.org/…-netteloader další diskusi na toto téma směřujte prosím tam.
- David Grudl
- Nette Core | 8215
Za řeči o odstřihnutí podpory PHP 5.2 a tom, kdy se má vydat jaké číslo verze, bude udílen týdenní ban, ok?
- Šaman
- Člen | 2658
Nojo, už je asi pozdě, ale tak
aspoň se zeptám: proč všechny výjimky nezačínají
ExceptionXxx
?? Výhodou by bylo našeptávání, zvláště když
jsou teď rozházené do různých jmenných prostorů.
Často si píšu výjimku kterou už v Nette máme, ale nevím o ní. Takto
by stačilo napsat exc..
a našeptávač dodá seznam všech
výjimek.