Utwórz wyjątek niestandardowy w języku Java

1. Wstęp

W tym samouczku omówimy, jak utworzyć niestandardowy wyjątek w Javie .

Pokażemy, jak wyjątki zdefiniowane przez użytkownika są implementowane i używane zarówno dla wyjątków zaznaczonych, jak i niezaznaczonych.

2. Potrzeba niestandardowych wyjątków

Wyjątki w języku Java obejmują prawie wszystkie ogólne wyjątki, które mogą wystąpić w programowaniu.

Czasami jednak musimy uzupełnić te standardowe wyjątki o własne.

Główne powody wprowadzenia niestandardowych wyjątków to:

  • Wyjątki logiki biznesowej - wyjątki specyficzne dla logiki biznesowej i przepływu pracy. Pomagają one użytkownikom aplikacji lub programistom zrozumieć, na czym dokładnie polega problem
  • Aby wychwycić i zapewnić określone podejście do podzbioru istniejących wyjątków Java

Wyjątki Java można zaznaczać i odznaczać. W następnych sekcjach omówimy oba te przypadki.

3. Wyjątek sprawdzany przez użytkownika

Zaznaczone wyjątki to wyjątki, które należy traktować jawnie.

Rozważmy fragment kodu, który zwraca pierwszą linię pliku:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) return file.nextLine(); } catch(FileNotFoundException e) { // Logging, etc } 

Powyższy kod jest klasycznym sposobem obsługi wyjątków sprawdzonych w Javie. Chociaż kod zgłasza wyjątek FileNotFoundException, nie jest jasne, jaka jest dokładna przyczyna - czy plik nie istnieje lub czy nazwa pliku jest nieprawidłowa.

Aby utworzyć wyjątek niestandardowy, musimy rozszerzyć klasę java.lang.Exception .

Zobaczmy przykład tego, tworząc niestandardowy sprawdzany wyjątek o nazwie IncorrectFileNameException:

public class IncorrectFileNameException extends Exception { public IncorrectFileNameException(String errorMessage) { super(errorMessage); } } 

Zauważ, że musimy również zapewnić konstruktor, który przyjmuje String jako komunikat o błędzie i nazywany konstruktorem klasy nadrzędnej.

To wszystko, co musimy zrobić, aby zdefiniować niestandardowy wyjątek.

Następnie zobaczmy, jak możemy użyć niestandardowego wyjątku w naszym przykładzie:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) return file.nextLine(); } catch (FileNotFoundException e) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException("Incorrect filename : " + fileName ); } //... } 

Stworzyliśmy i użyliśmy niestandardowego wyjątku, więc użytkownik może teraz wiedzieć, jaki jest dokładny wyjątek. Czy to wystarczy? W konsekwencji tracimy podstawową przyczynę wyjątku .

Aby to naprawić, możemy również dodać parametr java.lang.Throwable do konstruktora. W ten sposób możemy przekazać wyjątek root do wywołania metody:

public IncorrectFileNameException(String errorMessage, Throwable err) { super(errorMessage, err); } 

Teraz wyjątek IncorrectFileNameException jest używany wraz z główną przyczyną wyjątku w następujący sposób:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) { return file.nextLine(); } } catch (FileNotFoundException err) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException( "Incorrect filename : " + fileName , err); } // ... } 

W ten sposób możemy używać niestandardowych wyjątków bez utraty głównej przyczyny, z której wystąpiły .

4. Niestandardowy niesprawdzony wyjątek

W tym samym przykładzie załóżmy, że potrzebujemy niestandardowego wyjątku, jeśli nazwa pliku nie zawiera żadnego rozszerzenia.

W takim przypadku będziemy potrzebować niestandardowego niezaznaczonego wyjątku podobnego do poprzedniego, ponieważ ten błąd zostanie wykryty tylko w czasie wykonywania.

Aby utworzyć niestandardowy niezaznaczony wyjątek, musimy rozszerzyć klasę java.lang.RuntimeException :

public class IncorrectFileExtensionException extends RuntimeException { public IncorrectFileExtensionException(String errorMessage, Throwable err) { super(errorMessage, err); } } 

Dlatego w naszym przykładzie możemy użyć tego niestandardowego niezaznaczonego wyjątku:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) { return file.nextLine(); } else { throw new IllegalArgumentException("Non readable file"); } } catch (FileNotFoundException err) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException( "Incorrect filename : " + fileName , err); } //... } catch(IllegalArgumentException err) { if(!containsExtension(fileName)) { throw new IncorrectFileExtensionException( "Filename does not contain extension : " + fileName, err); } //... } 

5. Wniosek

Wyjątki niestandardowe są bardzo przydatne, gdy musimy obsłużyć określone wyjątki związane z logiką biznesową. Prawidłowo używane mogą służyć jako przydatne narzędzie do lepszej obsługi wyjątków i rejestrowania.

Kod przykładów użytych w tym artykule jest dostępny na Github.