Výjimky v Nette Framework 2.0

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ondřej Mirtes
Člen | 1536
+
0
-

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ě).

  1. 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)“).
  2. 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í.

  1. 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
+
0
-

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
+
0
-

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
+
0
-

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
+
+1
-

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?

westrem
Člen | 398
+
0
-

David Grudl napsal(a):

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?

+1 :)

Šaman
Člen | 2658
+
0
-

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.

jtousek
Člen | 951
+
0
-

Nejspíš protože to tak je v samotném PHP. Nic ti nebrání udělat si aliasy.