Multi catch – czyli łapanie wielu wyjątków jednocześnie

Wiesz już czym są wyjątki w Java, jak je rzucać oraz łapać, znasz składnie try-with-resources. Z tą wiedzą można stworzyć już sporą aplikację w Java. Jednak czasem kod tej aplikacji może wyglądać następująco:

Mimo, że pokazany wyżej kod działa poprawnie oraz spełnia założenia aplikacji (przynajmniej tak teraz zakładamy teraz). To nie jest to kod najlepszej jakości. Przyjrzyjmy się jak można go przepisać oraz przy okazji wykorzystać tzw. multi catch z Java 7.

Zacznijmy najpierw od tego jak takie problemy rozwiązywało się przed Java 7. Jakie problemy? możesz zapytać. Chodzi o niepotrzebną duplikację kodu, wszystkie bloki catch robią to samo (wypisują identyczny komunikat). Lepszym rozwiązaniem jest stworzenie prywatnej metody którą będziemy wołać z każdego bloku catch. W takim przypadku jeżeli przyjdzie nam zmienić komunikat, będziemy musieli zrobić to tylko w jednym miejscu, a nie jak to jest teraz w pięciu. Oto powyższy kod po modyfikacjach:

Innym możliwym rozwiązaniem jest po prostu złapanie wszystkich wyjątków typu Exception

tj.:

Chociaż wygląda to jak najlepsze rozwiązanie z punktu widzenia ilości kodu, to wcale takie nie jest. Głównym powodem jest to, że możemy przez nieuwagę złapać wyjątek który powinien zostać obsłużony w inny sposób. Powód ten bazuje na założeniu, że aplikacja jest ciągle rozwijana. Przez to właśnie mogą dojść nowe wyjątki wymagające innej obsługi. W takiej sytuacji poprzednie rozwiązanie (z kilkoma blokami catch) spowoduje błąd kompilacji (wynikający z nie obsłużenia zdeklarowanego wyjątku), a tym samy wymusi zastanowienie się nad tym co z tym wyjątkiem w tym miejscu należy zrobić.

W Java 7 oprócz try-with-resources pojawił się również multi catch. Pozwala on złapać kilka różnych, niezwiązanych ze sobą wyjątków w jednym bloku catch. W tym celu należy wymienić typy łapanych wyjątków po znaku “|” (ang. pipe). Z wykorzystaniem tej konstrukcji przykładowy kod będzie wyglądał następująco:

Nie musimy tworzyć prywatnej metody, nie trzeba też łapać wyjątków klasy Exception, wystarczy tylko wymienić te które chcemy obsłużyć w tym pojedynczym bloku catch. Dzięki temu rozwiązaniu również w sytuacji kiedy dojdzie nowy wyjątek w bloku try, kompilator poinformuje nas o konieczności jego obsłużenia.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *