Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


5.13

Verkettung von Exceptions


Der [1.4]Nachteil des eben beschriebenen Umsetzens von Exceptions ist, dass sich aus der Sicht des Aufrufers nicht mehr nachvollziehen lässt, was der eigentliche Grund für die Exception war. Insbesondere dann, wenn Exceptions über mehrere Stufen hinweg umgesetzt werden, erschwert dieser Umstand aber die Fehlersuche erheblich. Aus diesem Grund wurde in Version 1.4 das Konzept der verketteten Exceptions eingeführt. In diesem Konzept wurde die Klasse Throwable und damit auch Error und Exception um Konstruktoren und Methoden erweitert, mit denen sich zu einer Exception die verursachende Exception registrieren und abrufen lässt. Im Einzelnen sind dies Auf diese Weise lässt sich auch bei einer mehrstufigen Umsetzung noch die gesamte Kette verfolgen, was die Fehlersuche deutlich vereinfacht. Der nachfolgende Quelltext zeigt noch einmal das letzte Beispiel, diesmal unter Verwendung von Verkettung. Zunächst muss die benutzerdefinierte Exception über Konstruktoren verfügen, die die Verkettung erlauben. Hierbei folgt man einfach dem Muster von Throwable:
  public class NumberInputException
                     extends Exception {
  
    public NumberInputException(Exception cause) {
      super(cause);
    }
  
    public NumberInputException(String msg, Exception cause) {
      super(msg, cause);
    }
  
  }
Diese Konstruktoren können dann verwendet werden, um die Verkettung zu realisieren:
  public int readNumber() throws NumberInputException {
    int num = 0;
    String line;
    try {
      line = in.readLine();
      num = Integer.parseInt(line);
    }
    catch(NumberFormatException e) {
      throw new NumberInputException(e);
    }
    catch(IOException e) {
      throw new NumberInputException(e);
    }
    return num;
  }

Der Aufrufer von readNumber() könnte mit folgender Schleife die Kette ausgeben:
  int num;
  NumberInput input;
  ...
  
  try {
    num = input.readNumber();
  }
  catch(NumberInputException exc) {
    while(exc != null) {
      System.err.println(exc);
      exc = exc.getCause();
    }
  }
Zusammen mit den Informationen, die die ebenfalls in Version 1.4 eingeführte Methode Throwable.getStackTrace() liefert, kann ein Programm genaue Informationen darüber ermitteln, wie eine Exception durch die Aufrufhierarchie propagiert und umgesetzt wurde.


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.