Wrapping vs Rethrowing Ausnahmen in Java

1. Übersicht

Das Schlüsselwort throw in Java wird verwendet, um entweder eine benutzerdefinierte Ausnahme oder eine integrierte Ausnahme explizit auszulösen. Aber manchmal müssen wir im catch- Block dieselbe Ausnahme erneut auslösen. Dies führt dazu, dass eine Ausnahme erneut ausgelöst wird.

In diesem Tutorial werden die beiden häufigsten Methoden zum erneuten Auslösen der Ausnahme erläutert.

2. Ausnahmen erneut werfen

Manchmal möchten wir einige Aktivitäten ausführen, bevor wir die Ausnahme auf die höhere Ebene übertragen. Beispielsweise möchten wir möglicherweise die DB-Transaktion zurücksetzen, die Ausnahme protokollieren oder eine E-Mail senden.

Wir können solche Aktivitäten im catch-Block ausführen und die Ausnahme erneut auslösen. Auf diese Weise wird eine höhere Ebene benachrichtigt, dass die Ausnahme im System aufgetreten ist.

Lassen Sie uns unseren Fall anhand eines Beispiels verstehen.

Im Folgenden wird dieselbe Ausnahme erneut ausgelöst. Und wir protokollieren eine Fehlermeldung, bevor wir sie auslösen:

String name = null; try { return name.equals("Joe"); // causes NullPointerException } catch (Exception e) { // log throw e; }

Die Konsole zeigt die folgende Meldung an:

Exception in thread "main" java.lang.NullPointerException at com.baeldung.exceptions.RethrowSameExceptionDemo.main(RethrowSameExceptionDemo.java:16)

Wie wir sehen können, löst unser Code nur jede Ausnahme aus, die er abfängt. Aus diesem Grund erhalten wir den ursprünglichen Stack-Trace ohne Änderungen .

3. Ausnahmen einpacken

Schauen wir uns nun einen anderen Ansatz an.

In diesem Fall übergeben wir dieselbe Ausnahme als Referenz im Konstruktor einer anderen Ausnahme:

String name = null; try { return name.equals("Joe"); // causes NullPointerException } catch (Exception e) { // log throw new IllegalArgumentException(e); }

Die Konsole zeigt Folgendes an:

Exception in thread "main" java.lang.IllegalArgumentException: java.lang.NullPointerException at com.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:24) Caused by: java.lang.NullPointerException at com.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:18) 

Dieses Mal sehen wir die ursprüngliche Ausnahme sowie die einschließende. Auf diese Weise umschließt unsere IllegalArgumentException- Instanz die ursprüngliche NullPointerException als Ursache . Daher können wir die spezifischere Ausnahme anzeigen, anstatt die generische anzuzeigen.

4. Fazit

In diesem kurzen Artikel haben wir den Hauptunterschied zwischen dem erneuten Auslösen der ursprünglichen Ausnahme und dem ersten Umschließen dargestellt. Beide Methoden unterscheiden sich darin, wie sie die Ausnahmemeldung anzeigen .

Basierend auf unserer Anforderung können wir entweder dieselbe Ausnahme erneut auslösen oder sie mit einer bestimmten Ausnahme umschließen, indem wir den zweiten Ansatz verwenden. Der zweite Ansatz sieht sauberer aus und es ist einfach, die Ausnahme zurückzuverfolgen .

Wie immer ist das Projekt auf GitHub verfügbar.