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.
1 2 3 4 5 6 |
public class MyException extends Exception{ public MyException(); public MyException(String komunikat){ super(komunikat); } } |
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.
1 2 3 |
if (cosNieTak) { throw new MyException(„Coś poszło nie tak”); } |
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.
1 2 3 4 5 6 7 8 |
public class ExceptionTest { private class InnerException extends Exception { InnerException(); InnerException(String s){ super(s); } } } |
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ń.