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 throws
wszystkich metod , które wywołują twoją super popularną metodę. A także we throws
wszystkich metodach, które wywołują te metody. I w metodach, które wywołują te metody.
W rezultacie do throws
poł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 . cause może być null Określamy jego typ i konwertujemy na zmienną typu zaznaczonego . |
GO TO FULL VERSION