Tworzenie własnych wyjątków w Javie

Poprzedni wpis dotyczył przechwytywania oraz rzucania wyjątków.

Czasami mimo bogatego zbioru klas wyjątków w bibliotece standardowej Javy nie znajdziemy tego potrzebnego i jedynym wyjściem, aby nie rzucić zbyt ogólnym wyjątkiem jest utworzenie własnej klasy. Technicznie rzecz biorąc jest to bardzo proste – wystarczy utworzyć klasę, która dziedziczy po dowolnej klasie z drzewa Exception.

W rzeczywistości może to być nawet klasa Throwable, ale ze względu na hierarchię dziedziczenia (po Throwable dziedziczy także Error) lepiej skupić się na mniej ogólnej klasie.

Tworzenie własnego wyjątku

W pierwszej kolejności należy znaleźć klasę możliwie najbardziej oddającą specyfikę problemu, który chcemy opanować. Jeżeli jest to błąd związany z zapytaniem do bazy danych lepiej skorzystać z klasy SQLException niż ogólnie Exception.

Następnie tworzymy własną klasę dokładnie tak samo jak każdą inną. Jedynym warunkiem jest dziedziczenie po dowolnej klasie z poddrzewa klasy Exception.

Zwróćmy uwagę na dwa użyte konstruktory. Pierwszy pozwala na rzucenie wyjątku bez dodatkowego komentarza, natomiast w drugim mamy okazję dodatkowo wyświetlić swój komunikat w konsoli. Jest to dobra praktyka, aby dać możliwość programiście wybór, której wersji chcą użyć w swoim programie.

Przechwytywanie i obsługa takiego wyjątku wyglądają analogicznie do tych z biblioteki standardowej. Najpierw należy znaleźć miejsce narażone na wystąpienie błędu, a następnie rzucić lub przechwycić wyjątek tak jak zostało to wyjaśnione w poprzednim wpisie. Poniżej pokażemy w skrócie jak może wyglądać taka sytuacja.

Ogólne porady przy tworzeniu wyjątków

Zawsze zanim zdecydujemy się na utworzenie własnej klasy wyjątku należy dobrze przejrzeć bibliotekę standardową, gdyż posiada bardzo dużo różnych klas. Zasada działa też w drugą stronę – nie należy używać zbyt ogólnych wyjątków. Może w nich brakować odpowiednich metod, które nie mają zastosowania w innych przypadkach.

Jeżeli wyjątek jest bardzo specyficzny można go umieścić wewnątrz innej klasy. Jeśli będzie zadeklarowany jako klasa prywatna nie będzie  dostępny wtedy do innych klas w pakiecie. Taka forma wygląda następująco.

W następnej części pojawią się ogólne porady praktyczne odnośnie stosowania wyjątków. Skupimy się na tym dlaczego nie należy używać klasy Exception w celu przechwytywania wyjątków oraz pokażemy jak wygląda stos wywołań.