zurück weiter

Ausnahmebehandlung (1)

G.Eichelsdörfer
Staatliche Technikerschule Weilburg

In der klassischen C-Programmierung werden zur Fehler- bzw. Ausnahmebehandlung Funktionen verwendet, die im Resultat oder in einem Parameter Informationen über eine aufgetretene Ausnahme liefern. Dies erfordert nach jedem Funktionsaufruf mit potentieller Fehlermöglichkeit eine Auswertung der Ausnahmeinformation.

Wünschenswert erscheint ein Konstrukt, durch welches eine gebündelte Folge von Anweisungen sukzessive ausgeführt wird und sobald darin an irgendeiner Stelle eine Ausnahme auftritt, diese Ausnahme angemessen behandelt wird.

Beispiel: z = Arc sin(1/x)

  1. Lies Fließkommazahl in Variable x ein.
  2. Berechne Kehrwert von x und weise diesen der Variablen y zu.
  3. Berechne Arcus Sinus von y und weise diesen der Variablen z zu.
  4. Gib den Inhalt von z aus.

Zumindest in jedem der ersten drei Schritte kann es zu Fehlern bzw. Ausnahmen kommen (Eingabefehler, Division durch Null, Betrag des Arguments von Arc sin zu groß).

Klassische Implementation in C++:

Voraussetzung:
Die in der folgenden Sequenz aufgerufenen (fiktiven) Funktionen LiessFliesskommazahl() und Keherwert() liefern einen Wahrheitswert. Wird false bzw. 0 geliefert, bedeutet dies, dass ein Fehler festgestellt wurde. Zweckmäßgerweise wird die jeweils folgende Anweisung nur dann ausgeführt, wenn kein Fehler festgestellt wurde. In jedem Alternativzweig (else) wird eine geeignete Fehlerinformation über die Standard-Fehlerausgabeobjekt cerr ausgegeben.

...
if (LiesFliesskommazahl(x)) 
 if (Kehrwert(y,x)) // Kehrwert weist y den Kehrwert von x zu
  if (y>=-1 && y<=+1)
  {
   z = asin(y));
   cout << z;
  }
  else cerr << "Argumentwert-Fehler" << endl;
 else cerr << "Kehrwert-Fehler" << endl;
else cerr << "Fliesskomma-Einlesefehler" << endl;
...

Verbesserte Möglichkeiten in C++

Zunächst müssen die aufgerufenen Funktionen eine aufgetretene Ausnahme wie eine Funktionsstörung auf einem gesonderten Weg melden können (vgl. Not-Aus Schalter). Dies erfordert ein gegenüber ANSI-C neues Sprachkonstrukt.

Sobald eine Ausnahme gemeldet wird, dürfen die in der Sequenz folgenden Anweisungen nicht mehr ausgeführt werden. Statt dessen ist diese Ausnahme wie eine Störung zu behandeln.

Zum obigen Beispiel:

Wenn für x eine Null eingegeben wurde (1.), tritt bei der Berechnung des Kehrwertes (2.) eine Ausnahme auf - Division durch Null. Dann ist es völlig sinnlos, den Arc sin (3.) berechnen zu lassen. Genauso wenig macht es Sinn, den Inhalt von z ausgeben zu lassen (4.).

In C++ Syntax sieht dies folgendermaßen aus:

...
try // Buendelung der Anweisungen mit gemeinsamer Ausnahmebehandlung
{
  cin >> x;
  y = Kehrwert(x);
  z = Arcsin(y);
  cout << z << endl;
}
catch(...) // Jegliche Ausnahme wird behandelt
{
 cerr << "Ausnahme aufgetreten." << endl;
}
...

try und catch sind die für die Ausnahmebehandlung erforderlichen Schlüsselwörter in C++. Die geschweiften Klammern dahinter sind zwingend erforderlich, auch bei einer Einzelanweisung.