3. Zawijanie wyjątków
Sprawdzone wyjątki w teorii wydawały się świetną rzeczą, ale w praktyce okazały się całkowitym rozczarowaniem.
Załóżmy, że masz w swoim projekcie bardzo popularną metodę, która jest wywoływana z setek miejsc w programie. I decydujesz się dodać do niego nowy sprawdzony wyjątek . I równie dobrze może się okazać, że ten sprawdzony wyjątek jest naprawdę tak ważny i wyjątkowy, że tylko metoda main()wie, co zrobić, jeśli ten wyjątek zostanie złapany.
Dlatego będziesz musiał dodać sprawdzony wyjątek do throwswszystkich metod , które wywołują twoją super popularną metodę. A także we throwswszystkich metodach, które wywołują te metody. I w metodach, które wywołują te metody.
W rezultacie do throwspołowy metod projektu zostanie dodany nowy sprawdzony wyjątek . A potem okazuje się, że Twój projekt jest pokryty testami, a testy nie są kompilowane. Będziesz także musiał edytować rzuty w testach.
A potem cały twój kod (zmiany w setkach plików) będzie musiał zostać przejrzany przez innych programistów. I tu zadajemy sobie pytanie: dlaczego dokonaliśmy gruntownych zmian w projekcie? Dzień (dni?) pracy, zepsute testy, wszystko w celu dodania pojedynczego sprawdzonego wyjątku ?
Ale nadal występują problemy z dziedziczeniem i nadpisywaniem metod. Sprawdzone wyjątki powodują więcej problemów niż pożytku. Ogólnie rzecz biorąc, teraz niewielu ludzi je kocha i niewielu z nich korzysta.
Jednak nadal istnieje wiele kodu (w tym kod standardowej biblioteki Java), który zawiera te same sprawdzone wyjątki . I co z nimi zrobić? Nie da się tego zignorować, przetworzyć - nie wiadomo jak.
Programiści Java zasugerowali zawijanie sprawdzonych wyjątków w plikach RuntimeException. Innymi słowy, złap wszystkie sprawdzone wyjątki , zamiast tego utwórz niezaznaczone wyjątki (na przykład RuntimeException) i już je wyrzuć. Wszystko wygląda tak:
try
{
// Code where a checked exception might occur
}
catch(Exception exp)
{
throw new RuntimeException(exp);
}
Niezbyt piękne rozwiązanie, ale nic przestępczego: wyjątek został po prostu umieszczony wewnątrz wyjątku RuntimeException.
W razie potrzeby można go łatwo stamtąd uzyskać. Przykład:
| Kod | Notatka |
|---|---|
|
Otrzymujemy wyjątek przechowywany w pliku RuntimeException. causemoże być nullOkreślamy jego typ i konwertujemy na zmienną typu zaznaczonego . |
GO TO FULL VERSION