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
try
{
   // Code where we wrap the checked exception
   // in a RuntimeException
}
catch(RuntimeException e)
{
   Throwable cause = e.getCause();
   if (cause instanceof Exception)
   {
      Exception exp = (Exception) cause;
      // Exception handling code goes here
   }
}







Otrzymujemy wyjątek przechowywany w pliku RuntimeException. causemoże być null

Określamy jego typ i konwertujemy na zmienną typu zaznaczonego .