![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 1 Dołączył: 6.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam. Chciałem się dowiedzieć, kiedy NALEŻY stosować wyjątki w OOP? Chodzi mi o konkretne przykłady i jakieś dobre wytłumaczenie.
Wyjątki jak sama nazwa wskazuje, ale np . Kod $a=5; $b=0; if($a<$5){ ... } Też mogli byśmy użyć wyjątków? i czy powinno się? bless |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Czym dla mnie się różnią? Wyjątek i błąd to dla mnie nieco inne pojęcia. Wyjątek jest właściwie "podzbiorem" błędów, które nie są przez programistę przewidziane lub przewidywalne. W tej sytuacji więc, gdy mamy kontrolę danych dostarczonych przez usera wyjątki powinny być łapane dla całego obiektu gdyby coś jednak nie wyszło, ale błędy przewidywalne tylko komunikowane i odsługiwane przez programistę bez stosowania tego mechanizmu. Nie zaś, że rzucamy sobie wyjątek gdy user wprowadza nie pasujące do wzorca dane. To już jest bowiem kontrola przepływu danych i tutaj if-else w zupełności wystarcza.
Co do przykładu z zasobem to kwestia jest związana z sytuacją w jakiej to następuje. Jeśli aplikacja bazuje na połączeniu z zasobem i tym samym jest on integralną częścią, to jest to błąd i aplikacja powinna poinformować o tym fakcie gdy próbuje nawiązać połączenie i nie potrafi. Jeśli jednak aplikacja wie, że taki zasób jest i połączenie z nim ma, a w pewnym momencie nagle je traci to jest to już sytuacja wyjątkowa. W pierwszym bowiem wypadku już od samego początku wiemy, że zasób jest niedostępny i nie możemy z nim pracować. W drugim zasób jest i nagle znika. Pierwsze jest normą, gdyż możesz przewidzieć dokładnie wystąpienie błędu i jego miejsce. Tego nie można nazwać wyjątkiem. Ale jak przewidzisz wystąpienie drugiej sytuacji, która może mieć miejsce dokładnie w dowolnym momencie począwszy od momentu nawiązania połączenia do czasu jego zakończenia? Nie da się wprost powiedzieć: "To nastąpi w 5 sekund od nawiązania połączenia.", ale w wyniku debugu możemy określić przyczyny lub okoliczności wystąpienia, a tym samym możemy wyeliminować jej zajście i sprawić, że przestaje być wyjątkowa (IMG:style_emoticons/default/wink.gif) Stwierdzasz, że albo rzucamy wyjątek albo zdajemy się na programistę... Czyli jako programista mogę mogę nie przejmować się błędem i jego obsługą tylko rzucam wyjątek i niech martwi się o to ten, który ów kod dołącza do aplikacji? Popatrz może dokładniej na kody Javowców i innych programistów. Tam jest wiele struktur kontrolnych, które powstają w momencie wykrycia nieprawidłowości poprzez wyjątek, a same wyjątki służą tylko wyłapywaniu nieprzewidzianych sytuacji, a nie by sterować. To z czym się nie zgadzam w tym co napisałeś to fakt czego nie napisałeś. Dla mnie pełniejsza wersja to: "Wyjątki są od obsługi błędów, których miejsca i czasu wystąpienia nie potrafimy określić w chwili tworzenia aplikacji". Przykład z różnicą między błędami jest prosty i zależy od... złożoności aplikacji. Czemu? Jeśli nie mamy w kodzie możliwości sprawdzenia poprawności danych to sprawdzenie czy plik jest uszkodzony jest dla nas niewychwytywalne. W takim wypadku gdy podczas pracy natrafimy na uszkodzony fragment zachodzi sytuacja wyjątkowa. Jeśli jednak kod sprawdzić potrafi możliwość wystąpienia uszkodzenia, to olanie tego przez programistę jest jego błędem i powinno to być wychwycone na etapie testowania oraz poprawione. Dlatego Twoje 3 punkty (właściwie to 2 pierwsze, bo trzeci jest jak najbardziej prawidłowy) nieco skoryguję: 1. Wyjątki służą do obsługi błędów, które nie są przez programistę przewidziane lub przewidywalne. Poznając okoliczności zaistnienia, wyjątek staje się błędem zwykłym i zdolnym do wyeliminowania w 99% wypadków. Pozostały 1% jest zależny od środowiska uruchomieniowego i wpływu procesów zewnętrznych na samą aplikację lub powiązane z nią zasoby. Tym samym jest nieprzewidywalny z samej swojej natury i w zasadzie nigdy nie można go wyeliminować. 2. Wyjątki wyrzuca się gdy dany kod nie może zakończyć pracy pomyślnie ze względu na czynniki, które są poza zasięgiem i przewidywaniami specyfikacji. Tak więc mając jakąś metodę typu isValid(), którą jesteśmy w stanie wykryć istnienie błędu, wyjątki są techniką zbędną. Wywalimy wyjątek gdy coś jest niepoprawne, choć z przebiegu całości procesu nie da się wywnioskować chwili jego zaistnienia i powinno się dostać prawidłowe wyniki, co jednak nie zachodzi lub dochodzimy do sytuacji nietypowej dla aplikacji. 3. Wyjątki i tzw. struktury kontrolne mogą ze sobą bez problemu współgrać. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 2.10.2025 - 12:35 |