![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%) ![]() ![]() |
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:
(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 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%) ![]() ![]() |
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. 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”. 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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 13.10.2025 - 17:44 |