Home   Cover Cover Cover Cover
 

Nutzen der Ausnahmebehandlung

Wenn eine Sprache keine Ausnahmebehandlung besitzt, muss jede Methode einen Fehlercode liefern, auf den der Rufer dann reagieren kann, also z.B.:

  errCode = M1(...);
  if (errCode == 0) {
    errCode = M2(...);
    if (errCode == 0) {
      errCode = M3(...);
      if (errCode != 0) Error(...);
    } else Error(...);
  } else Error(...);

Aus diesem Beispiel kann man mehrere Vorteile der Ausnahmebehandlung ableiten:

  • Im obigen Beispiel kann man kaum noch erkennen, was der Normalfall (d.h. die Aufrufe von M1, M2 und M3) und was der Fehlerfall ist. Bei Verwendung einer try-Anweisung sind hingegen der fehlerfreie Normalfall des Programms und die einzelnen Fehlerfälle sauber getrennt.
  • Wenn der Programmierer im obigen Beispiel vergisst, einen Fehlercode abzufragen, dann geht dieser Fehler verloren. Das kann bei der Ausnahmebehandlung nicht geschehen. Gibt es dort keine catch-Klausel für eine Ausnahme, bricht das Programm zumindest mit einem Fehler ab.
  • Eine Ausnahme ist ein Objekt, in dem Informationen über die Art und den Ort des Fehlers abgelegt werden können. Ein Fehlercode hingehen ist viel weniger aufschlussreich.
  • Im obigen Beispiel muss jede Methode mit Parametern oder einem Funktionstyp für die Fehlerbehandlung deklariert werden. Bei Verwendung der Ausnahmebehandlung erspart man sich die Deklaration dieser Parameter.
  • Eine Methode kann u.U. viele verschiedene Fehler an den Rufer melden. Das alles in einem Fehlercode zu codieren ist umständlich. Bei der Ausnahmebehandlung hingegen kann man für jede Fehlerart eine eigene Ausnahme auslösen und beliebig viele catch-Klauseln zu ihrer Behandlung anschreiben.

Als Nachteile der Ausnahmebehandlung kann man anführen, dass die Programmiersprache durch sie etwas komplexer wird und dass man mehr Schreibaufwand hat (Man muss eine Ausnahmeklasse deklarieren sowie eine try-catch-Anweisung und mehrere throw-Anweisungen schreiben). Im Allgemeinen nimmt man diese kleinen Nachteile jedoch wegen der viel größeren Vorteile in Kauf.

Manche Leute halten es für einen schweren Nachteil, dass man in C# nicht wie in Java im Methodenkopf angeben kann, welche Ausnahmen eine Methode auslöst. Aus softwaretechnisches Sicht wäre diese Spezifikation natürlich wünschenswert, denn erstens dokumentiert sie die möglichen Fehlerfälle und zweitens kann der Compiler auf diese Weise prüfen, ob der Rufer einer Methode wirklich alle Ausnahmen abfängt. Allerdings hat sich gezeigt, dass Programmierer faul sind und dem Zwang, jede Ausnahme abfangen zu müssen, damit begegnen, dass sie "vorerst" einmal leere catch-Klauseln anschreiben, die sie dann später vergessen auszufüllen. Eine leere catch-Klausel ist aber schlimmer als gar keine, weil sie einen auftretenden Fehler schluckt. In C# führt ein nicht abgefangener Fehler zumindest zu einem Programmabsturz.