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.