Verkettete Ausnahmen in Java

Verkettete Ausnahmen in Java

 

1. Überblick

In diesem Artikel werden wir uns kurz mitException befassen und die verketteten Ausnahmen in Java ausführlich erläutern.

Einfach ausgedrückt ist einexception ein Ereignis, das den normalen Ablauf der Programmausführung stört. Lassen Sie uns nun genau sehen, wie wir Ausnahmen verketten können, um eine bessere Semantik daraus zu ziehen.

2. Verkettete Ausnahmen

VerketteteException helfen dabei, eine Situation zu identifizieren, in der eine Ausnahme weitereException in einer Anwendung verursacht.

For instance, consider a method which throws an ArithmeticException aufgrund eines Versuchs, durch Null zu teilen, aber die eigentliche Ausnahmeursache war ein E / A-Fehler, der dazu führte, dass der Teiler Null war. Die Methode wirft dieArithmeticException an den Aufrufer. Der Anrufer würde die tatsächliche Ursache vonException nicht kennen. In solchen Situationen wird verkettetesException verwendet.

Dieses Konzept wurde in JDK 1.4 eingeführt.

Lassen Sie uns sehen, wie verkettete Ausnahmen in Java unterstützt werden.

3. Throwable Klasse

Die KlasseThrowableverfügt über einige Konstruktoren und Methoden zur Unterstützung verketteter Ausnahmen. Schauen wir uns zunächst die Konstruktoren an.

  • Throwable(Throwable cause)Throwable hat einen einzelnen Parameter, der die tatsächliche Ursache vonException angibt.

  • Throwable(String desc, Throwable cause) Dieser Konstruktor akzeptiert auch eine Beschreibung vonExceptionmit der tatsächlichen Ursache vonException.

Schauen wir uns als nächstes die Methoden dieser Klasse an:

  • getCause() method - Diese Methode gibt die tatsächliche Ursache für das aktuelleException zurück.

  • initCause() method - Legt eine zugrunde liegende Ursache fest, indemException aufgerufen wird.

4. Beispiel

Schauen wir uns nun das Beispiel an, in dem wir unsere eigene Beschreibung fürExceptionfestlegen und verketteteException werfen:

public class MyChainedException {

    public void main(String[] args) {
        try {
            throw new ArithmeticException("Top Level Exception.")
              .initCause(new IOException("IO cause."));
        } catch(ArithmeticException ae) {
            System.out.println("Caught : " + ae);
            System.out.println("Actual cause: "+ ae.getCause());
        }
    }
}

Wie vermutet, wird dies zu Folgendem führen:

Caught: java.lang.ArithmeticException: Top Level Exception.
Actual cause: java.io.IOException: IO cause.

5. Warum verkettete Ausnahmen?

Wir müssen die Ausnahmen verketten, um die Protokolle lesbar zu machen. Schreiben wir zwei Beispiele. Erstens ohne Verkettung der Ausnahmen und zweitens mit verketteten Ausnahmen. Später werden wir vergleichen, wie sich Protokolle in beiden Fällen verhalten.

Zunächst erstellen wir eine Reihe von Ausnahmen:

class NoLeaveGrantedException extends Exception {

    public NoLeaveGrantedException(String message, Throwable cause) {
        super(message, cause);
    }

    public NoLeaveGrantedException(String message) {
        super(message);
    }
}

class TeamLeadUpsetException extends Exception {
    // Both Constructors
}

Beginnen wir nun damit, die obigen Ausnahmen in Codebeispielen zu verwenden.

5.1. Ohne Verkettung

Schreiben wir ein Beispielprogramm, ohne unsere benutzerdefinierten Ausnahmen zu verketten.

public class MainClass {

    public void main(String[] args) throws Exception {
        getLeave();
    }

    void getLeave() throws NoLeaveGrantedException {
        try {
            howIsTeamLead();
        } catch (TeamLeadUpsetException e) {
            e.printStackTrace();
            throw new NoLeaveGrantedException("Leave not sanctioned.");
        }
    }

    void howIsTeamLead() throws TeamLeadUpsetException {
        throw new TeamLeadUpsetException("Team Lead Upset");
    }
}

Im obigen Beispiel sehen die Protokolle folgendermaßen aus:

com.example.chainedexception.exceptions.TeamLeadUpsetException:
  Team lead Upset
    at com.example.chainedexception.exceptions.MainClass
      .howIsTeamLead(MainClass.java:46)
    at com.example.chainedexception.exceptions.MainClass
      .getLeave(MainClass.java:34)
    at com.example.chainedexception.exceptions.MainClass
      .main(MainClass.java:29)
Exception in thread "main" com.example.chainedexception.exceptions.
  NoLeaveGrantedException: Leave not sanctioned.
    at com.example.chainedexception.exceptions.MainClass
      .getLeave(MainClass.java:37)
    at com.example.chainedexception.exceptions.MainClass
      .main(MainClass.java:29)

5.2. Mit Verkettung

Als nächstes schreiben wir ein Beispiel mit der Verkettung unserer benutzerdefinierten Ausnahmen:

public class MainClass {
    public void main(String[] args) throws Exception {
        getLeave();
    }

    public getLeave() throws NoLeaveGrantedException {
        try {
            howIsTeamLead();
        } catch (TeamLeadUpsetException e) {
             throw new NoLeaveGrantedException("Leave not sanctioned.", e);
        }
    }

    public void howIsTeamLead() throws TeamLeadUpsetException {
        throw new TeamLeadUpsetException("Team lead Upset.");
    }
}

Schauen wir uns zum Schluss die Protokolle an, die mit verketteten Ausnahmen erhalten wurden:

Exception in thread "main" com.example.chainedexception.exceptions
  .NoLeaveGrantedException: Leave not sanctioned.
    at com.example.chainedexception.exceptions.MainClass
      .getLeave(MainClass.java:36)
    at com.example.chainedexception.exceptions.MainClass
      .main(MainClass.java:29)
Caused by: com.example.chainedexception.exceptions
  .TeamLeadUpsetException: Team lead Upset.
    at com.example.chainedexception.exceptions.MainClass
  .howIsTeamLead(MainClass.java:44)
    at com.example.chainedexception.exceptions.MainClass
  .getLeave(MainClass.java:34)
    ... 1 more

Wir können die angezeigten Protokolle leicht vergleichen und daraus schließen, dass die verketteten Ausnahmen zu saubereren Protokollen führen.

6. Fazit

In diesem Artikel haben wir uns mit dem Konzept verketteter Ausnahmen befasst.

Die Implementierung aller Beispiele finden Sie inthe Github project - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.