Ist es eine schlechte Praxis, Throwable zu fangen?

1. Übersicht

In diesem Tutorial werden die Auswirkungen des Fangens von Throwable untersucht .

2. Die Throwable Klasse

In der Java-Dokumentation wird die Throwable- Klasse als „ Superklasse aller Fehler und Ausnahmen in der Java-Sprache “ definiert.

Schauen wir uns die Hierarchie der Throwable- Klasse an:

Die Throwable- Klasse hat zwei direkte Unterklassen, nämlich die Error- und die Exception- Klasse.

Fehler und seine Unterklassen sind nicht aktivierte Ausnahmen, während die Unterklassen von Ausnahme entweder aktivierte oder nicht aktivierte Ausnahmen sein können.

Schauen wir uns die Situationen an, die ein Programm erleben kann, wenn es fehlschlägt.

3. Wiederherstellbare Situationen

Es gibt Situationen, in denen eine Wiederherstellung im Allgemeinen möglich ist und mit aktivierten oder nicht aktivierten Unterklassen der Ausnahmeklasse behandelt werden kann .

Beispielsweise möchte ein Programm möglicherweise eine Datei verwenden, die am angegebenen Speicherort nicht vorhanden ist, was dazu führt, dass eine aktivierte FileNotFoundException ausgelöst wird.

Ein weiteres Beispiel ist das Programm, das versucht, auf eine Systemressource zuzugreifen, ohne die Berechtigung dazu zu haben, was dazu führt, dass eine nicht aktivierte AccessControl- Ausnahme ausgelöst wird.

Gemäß der Java-Dokumentation gibt die Exception- Klasse „Bedingungen an, die eine vernünftige Anwendung möglicherweise abfangen möchte “.

4. Nicht behebbare Situationen

Es gibt Fälle, in denen ein Programm in einen Zustand geraten kann, in dem eine Wiederherstellung im Falle eines Fehlers nicht möglich ist. Häufige Beispiele hierfür sind, wenn ein Stapelüberlauf auftritt oder der JVM nicht genügend Speicher zur Verfügung steht.

In diesen Situationen führt die JVM Stackoverflow und OutOfMemoryError sind. Wie aus ihren Namen hervorgeht, handelt es sich hierbei um Unterklassen der Fehlerklasse .

Laut der Java-Dokumentation weist die Fehlerklasse „auf schwerwiegende Probleme hin, die eine vernünftige Anwendung nicht abfangen sollte “.

5. Beispiel für wiederherstellbare und nicht wiederherstellbare Situationen

Nehmen wir an, wir haben eine API, mit der Aufrufer mithilfe der Methode addIDsToStorage eindeutige IDs zu einer Speichereinrichtung hinzufügen können :

class StorageAPI { public void addIDsToStorage(int capacity, Set storage) throws CapacityException { if (capacity < 1) { throw new CapacityException("Capacity of less than 1 is not allowed"); } int count = 0; while (count < capacity) { storage.add(UUID.randomUUID().toString()); count++; } } // other methods go here ... }

Beim Aufrufen von addIDsToStorage können mehrere potenzielle Fehlerpunkte auftreten :

  • CapacityException - Eine überprüfte Unterklasse von Exception, wenn ein Kapazitätswert von weniger als 1 übergeben wird
  • Nullpointer - Eine ungeprüfte Unterklasse von Exception , wenn ein Null - Speicherwert anstelle einer Instanz zur Verfügung gestellt Sets
  • OutOfMemoryError - Eine nicht aktivierte Unterklasse von Error, wenn der JVM der Speicherplatz ausgeht, bevor die while- Schleife verlassen wird

Die Situationen CapacityException und NullPointerException sind Fehler, von denen das Programm wiederhergestellt werden kann, aber der OutOfMemoryError ist nicht behebbar .

6. Throwable fangen

Nehmen wir an, der Benutzer der API fängt beim Aufrufen von addIDsToStorage nur Throwable im try-catch ab :

public void add(StorageAPI api, int capacity, Set storage) { try { api.addIDsToStorage(capacity, storage); } catch (Throwable throwable) { // do something here } }

Dies bedeutet, dass der aufrufende Code auf die gleiche Weise auf wiederherstellbare und nicht wiederherstellbare Situationen reagiert.

Die allgemeine Regel bei der Behandlung von Ausnahmen lautet, dass der Try-Catch- Block beim Abfangen von Ausnahmen so spezifisch wie möglich sein muss. Das heißt, ein Allround-Szenario muss vermieden werden .

Das Fangen von Throwable verstößt in unserem Fall gegen diese allgemeine Regel. Um auf wiederherstellbare und nicht wiederherstellbare Situationen getrennt zu reagieren, müsste der aufrufende Code die Instanz des Throwable- Objekts im catch- Block untersuchen.

Der bessere Weg wäre, einen bestimmten Ansatz bei der Behandlung von Ausnahmen zu verwenden und zu vermeiden, mit nicht behebbaren Situationen umzugehen .

7. Fazit

In diesem Artikel haben wir uns mit den Auswirkungen des Fangens von Throwable in einem Try-Catch- Block befasst.

Wie immer ist der vollständige Quellcode des Beispiels auf Github verfügbar.