Verwenden von Ausnahmen ohne Fehler

Kann man Ausnahmen auch für etwas anderes als zur Fehlerbehandlung verwenden? Natürlich ja, verbieten kann einem das niemand.

Ein etwas extremes Beispiel, einen String zu kopieren, wäre:

  char *s = "abc";
  char array[20];
  try
    {
      char *src = s;
      char *dst = array;
      while( 1 )
        {
          *dst++ = *src;
          if( 0==*src++ )
            {
              throw "fertig";
            }
        }
    }
  catch( ... )
    {
    }
Hier wird die Schleife formal als Endlosschleife geschrieben, und dann nach dem Kopieren mit einem throw verlassen (anstatt einem break).

Prinzipiell ist es durchaus möglich, Ausnahmen auch für etwas anderes als Fehler zu verwenden: ein Schleifenende kann kaum als Fehler bezeichnet werden.

Generell wird aber von solchen Spielereien mehr oder weniger streng abgeraten, je nachdem wen man fragt.

Ein existierendes Programm zu verstehen, ist in der Praxis schon schwer genug (sogar ein eigenes, aber noch viel mehr wenn es der geistige Auswuchs eines Kollegen ist). Ausnahmen für nicht fehlerhafte Programmzustände zu verwenden, steigert die Verständlichkeit sicher nicht.

Es lassen sich aber durchaus Fälle finden, in denen Ausnahmen zumindest einen gewissen Charme haben. Beispielsweise hat man in C++ keine Möglichkeit, aus einer Funktion mit einer bestimmten Signatur je nach den Umständen mal einen Wert eines Typs, mal eines anderen Typs zurückzugeben. Indem man aber Ausnahmen von verschiedenen Typen werfen kann, geht es auf einmal doch!

Zumindest kann man damit enorme Kreativität beweisen.

Ein ganz anderer Punkt ist die Laufzeiteffizienz: Üblicherweise kostet die Verwendung von try...catch nicht nennenswert Laufzeit, solange keine Ausnahmen geworfen werden. Das Werfen von Ausnahmen dagegen liegt zumindest in der Größenordnung eines Funktionsaufrufs (inklusive Rücksprung), kann aber auch noch teurer sein. Dies verursacht dem Hersteller kein schlechtes Gewissen, weil Fehler nicht allzu häufig auftreten sollten im Vergleich zu fehlerfrei laufendem Programmcode. Mißbraucht man Ausnahmen dagegen für Programmzustände, die eigentlich keine Fehler sind, sondern häufig auftreten, kann man durchaus mit Laufzeiteinbußen rechnen.

AnyWare@Wachtler.de