Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Wyjątki PHP, na przykładzie
wNogachSpisz
post
Post #1





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Witam

Jestem w trakcie pisania biblioteki - ujednoliconego API - służącej do obsługi usług rozwiązywania captch. Nie muszę chyba nikogo przekonywać, że dobrze zaprojektowany system wyjątków to podstawa. Niestety nigdy się w to nie bawiłem, tzn. często używam wyjątków, ale nigdy nie próbowałem definiować własnych klas wyjątków. Przeczyłem ten artykuł: http://blogs.msdn.com/b/kcwalina/archive/2...ierarchies.aspx
Uznałem że zaproponowany tam podział na "usage exception" oraz "system exception" wydaje się rozsądny.
Moj kod wygląda następująco:
  1. class Decaptcha_Exception extends Exception
  2. {}
  3. class Decaptcha_Exception extends Exception
  4. {}
  5. /*
  6. 99: unknown error
  7.  */
  8.  
  9. class DecaptchaUsage_Exception extends Decaptcha_Exception
  10. {}
  11. /*
  12. 101: invalid login or password
  13. 102: captcha file not found / file empty
  14. 103: not logged in
  15. */
  16.  
  17. class DecaptchaSystem_Exception extends Decaptcha_Exception
  18. {}
  19.  
  20. class DecaptchaSystemLogical_Exception extends DecaptchaSystem_Exception
  21. {}
  22. /*
  23. 201: unable to decode captcha (too hard or malformed image)
  24. 202: banned
  25. 203: insufficient funds
  26. 204: service overload
  27. 205: invalid response
  28. 206: connection failed/lost/timeout
  29. 207: network error
  30. */
  31.  
  32. class DecaptchaSystemFailure_Exception extends DecaptchaSystem_Exception
  33. {}
  34. /*
  35. 301: php extension not found
  36. 302: php function not found
  37. */

(przepraszam za tabulatory ale odzwierciedlają one hierarchę).

Pytanie: Co należałoby tu zmienić, czy np. "202: insufficient funds" pasuje bardziej do "SystemLogical_Exception" czy może "Usage_Exception". Czy to co zrobiłem ma jakikolwiek sens? (IMG:style_emoticons/default/smile.gif)

Ten post edytował wNogachSpisz 26.02.2013, 19:10:13
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
wNogachSpisz
post
Post #2





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Cytat(Crozin @ 26.02.2013, 18:36:28 ) *
1. W PHP powinieneś rozróżnić dwie podstawowe "rodziny" wyjątków: LogicalException oraz RuntimeException (hierarchia wbudowanych wyjątków). Te pierwsze wynikają z "błędów programisty", te ostatnie zaś z błędnego użycia przez użytkownik, konfiguracji środowiska i ogóle wszystkiego co możne wystąpić wyłącznie w trakcie działania aplikacji.

Chyba odwrotnie, LogicalException to błąd użycia, a RuntimeException, błąd programu. Tak czy inaczej, podział ten wydaje gorszy od zaproponowanego przez P. Krzysztofa. Podam przykład: "network error" problem z siecią nie powstaje z powodu błędnego inputa, ani tego że program jest źle napisany, tylko.. no wlasnie, z przyczyn niezależnych :-]
Rozumiem że według Ciebie powiniem rozszerzyc RuntimeException o NetworkException, ale takie podejście to pułapka, czytamy:
„I would consider not creating new exception types till you are sure you need them. At which point, you can create a new exception type by inheriting from the currently throw type. Sometimes it might result in slightly strange exception hierarchy (for example, a custom exception inheriting from InvalidOperationException), but it’s not a big deal in comparison to the cost having unnecessary exception types in your library, which makes the library more complex, adds development cost, increases working set, etc.”
Autor radzi aby nie tworzyć nowych klas, bo program staje się zbyt skomplikowany, w tym punkcie się z nim zgadzam. Błąd "network error" klasyfikuje w tym podziale jako "System Logical Exception" , czyli błąd ktory nie musi spowodować zakończenia programu i nie jest spowodowany błędnym inputem.

Cytat(Crozin @ 26.02.2013, 18:36:28 ) *
2. Twoje wyjątki powinny u swojej podstawy rozszerzać, którąś z tych dwóch gałęzi, nie zaś bezpośrednio klasę Exception.

Przyjrzyj się dokładniej, dziedziczą z „Decaptcha_Exception”.

Cytat(Crozin @ 26.02.2013, 18:36:28 ) *
3. Na dobrą sprawę w większości przypadków nie potrzebujesz nawet własnych klas dla tych wyjątków.

Nigdy nie potrzebowałem, ale dzisiaj uznałem że czas na małe rozwarstwienie. Warto zauważyć, że zostawiam sobie fallback, mianowicie, wszystkie wyjątki można rozpoznać bez podziału na klasy po ich unikatowych kodach błędu.

Ten post edytował wNogachSpisz 26.02.2013, 19:07:48
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 13.10.2025 - 17:44