Ausnahmen und Ausnahembehandlung
Was sind Exceptions und was ist Exception Handling?
Fehler treten in der Softwareentwicklung ständig und überall auf, wer sich regelmäßig mit der Programmierung beschäftigt, dem ist diese unangenehme Tatsache schon längst bewusst.
Es gibt einige klassische Grundanforderungen an Software in Bezug auf Fehler. Zum einen soll eine Software ihre Spezifikationen korrekt erfüllen. Zum anderen soll sich Software vernünftig verhalten. Und das sogar in unvorhergesehenen oder nicht spezifizierten Situationen. Bei der Ausführung von Programmen kann es zu Ereignissen kommen, die nicht zum normal Programmablauf gehören jedoch trotzdem sinnvoll behandelt werden müssen. Jeder gute Programmierer sollte mit solchen Ausnahmesituationen umgehen können und diese angemessen behandeln. Werden Fehler- und Ausnahmebehandlungen vernachlässigt, trägt das häufig zur Frustration der Benutzer bei.
Softwarefehler / Programmfehler (Error)
Ein Fehler weist auf ein Problem hin, welches hauptsächlich auf fehlende Systemressourcen zurückzuführen ist. Also zum Beispiel Systemabsturzfehler und Fehler wegen unzureichendem Speicher. Angemessene Anwendungen sollten diese Probleme in der Regel nicht abfangen, sondern durch eine Fehlerbehandlung nach einem entsprechendem Hinweis zum Abbruch des Programms führen.
Woher kommt eigentlich der Begriff Bug?
In der Computerwelt, speziell in der Softwareentwicklung spricht man häufig von „Bugs“, wenn etwas nicht ordnungsgemäß funktioniert. Aber was bedeutet dieser Begriff und woher stammt er?
Ein Bug ist also ein allgemeiner Begriff, der verwendet wird, um jedes unerwartete Problem mit Hardware oder Software zu beschreiben. Im englischen bedeutet das Wort Bug so viel wie Käfer oder Wanze.
Es ist nicht eindeutig klar woher dieser Begriff stammt, oder wer ihn zum ersten Mal in Bezug auf einen Computerfehler benutzte. Es gibt dazu allerdings eine lustige Geschichte:
„Die Verknüpfung des Begriffs mit Computern geht möglicherweise auf die Computerpionierin Grace Hopper zurück. Sie verbreitete die Geschichte, dass am 9. September 1945 eine Motte in einem Relais des Computers Mark II Aiken Relay Calculator zu einer Fehlfunktion führte. Die Motte wurde entfernt, in das Logbuch geklebt und mit folgender Notiz versehen: “First actual case of bug being found.” (deutsch: „Das erste Mal, dass tatsächlich ein ‚Ungeziefer‘ gefunden wurde.“). Die Legende der Begriffsfindung hält sich hartnäckig, obwohl die Logbuch-Eintragung gerade darauf verweist, dass der Begriff schon zuvor gängig war. Zudem irrte Grace Hopper sich hinsichtlich des Jahres: Der Vorfall ereignete sich tatsächlich am 9. September 1947. Die entsprechende Seite des Logbuchs wurde bis Anfang der 1990er Jahre am Naval Surface Warfare Center Computer Museum der US-Marine in Dahlgren, Virginia, aufbewahrt. Zurzeit befindet sich diese Logbuchseite mit der Motte am Smithsonian Institute.“
Quelle: Seite „Programmfehler“. In: Wikipedia, Die freie Enzyklopädie. Bearbeitungsstand: 11. April 2021, 13:04 UTC. URL: https://de.wikipedia.org/w/index.php?title=Programmfehler&oldid=210822920 (Abgerufen: 24. Juni 2021, 09:14 UTC)

Exceptions (Ausnahmen)
Ausnahmen (Exceptions) werden in der Softwareentwicklung eingesetzt, um gesonderte Behandlungen bestimmter Situationen zu gewährleisten. Bestimmte Exceptions werden bei der Erkennung eines Problems ausgelöst und erlauben die Fehlerbehandlung an einer beliebigen Stelle im Code.
Es handelt sich also nicht um Programmfehler, sondern um Abweichungen vom Normalfall. Was bei solchen Abweichungen während der Programmlaufzeit geschehen soll, wird in sogenannten Ausnahmebehandlungsroutinen beschrieben. Die Aufgabe der Programmierer ist es, Ausnahmen abzufangen und gesondert zu behandeln. Ausnahmen werden häufig in zwei Kategorien unterteilt. Java zum Beispiel unterscheidet zwischen checked und unchecked Exceptions. C++ hingegen behandelt alle Exceptions als unchecked.
Geprüfte Ausnahmen (Checked Exceptions)
Hierbei handelt es sich im Normalfall um Ausnahmen, die zur Laufzeit geprüft werden. Ein Programm kann sich davon erholen. Von Softwareentwicklern wird erwartet, diese Ausnahmen zu überprüfen. Häufig wird dies durch einen try-catch Block und durch die throw-Anweisung gelöst. Hierbei handelt es sich entweder um vordefinierte oder um selbst definierte Exceptions. Man kann nämlich auch eigene Ausnahmeklassen erstellen, um Probleme darzustellen, die innerhalb der von dir geschriebenen Klassen auftreten können. Wenn du ein Paketentwickler bist, musst du möglicherweise sogar einen eigenen ganzen Satz von Ausnahmeklassen erstellen, damit Benutzer einen Fehler, der in deinem Paket auftreten kann, von Fehlern unterscheiden kann, die in der Plattform oder anderen Paketen auftreten.
Beispiele: FileNotFoundException, IOException
Ungeprüfte Ausnahmen (Unchecked Exceptions)
Andererseits gibt es unchecked exceptions. Dabei handelt es sich um Ausnahmen die nicht zur Laufzeit geprüft werden und somit auch nicht vorkommen sollten. Sie treten trotzdem auf, müssen aber nicht behandelt werden. Anstatt die Ausnahme zur Laufzeit zu behandeln, sollte das Programmierproblem behoben werden, ansonsten stürzt das Programm mit einer Fehlermeldung ab.
Beispiele: NullPointerException, IllegalArgumentException, IllegalStateException, ClassCastException
Beispiel für Exceptions:
ArrayOutOfboundsException | Indexüberschreitung |
ArithmeticException | Division durch 0 |
NullPointerEyception | Null Wert wird aufgerufen, ist aber nicht erlaubt oder wird nicht erwartet |
EOFException | Lesen über das Ende einer Datei hinaus |
IndexOutOfBoundsException | Lesen über Arraygrenzen hinweg |
IllegalArgumentException | Aufruf einer Methode mit unzulässigen Parametern |
IllegalStateException | Objekt für Methodenaufruf befindet sich im falschen Zustand |
Exception Handling
Ausnahmebehandlung mit throw und try-catch
throw | Auslösen einer Ausnahme |
try | Ausprobieren |
catch | Auffangen der Ausnahme |
Eine Ausnahmebehandlung ist ein Mechanismus um, speziell Fehler die während der Laufzeit eines Programms auftreten, zu behandeln. Bei Erkennung eines Fehlers wird ein Programmteil ausgeführt, der den Fehler behebt oder an andere Programmebenen zur Weiterverarbeitung weiterreicht. Exceptions können an jeder beliebigen Stelle im Programmcode manuell ausgelöst bzw. ausgeworfen werden. In den meisten gängigen Programmiersprachen geschieht das durch das Schlüsselwort throw, welches direkt ein Exception-Objekt mit entsprechenden Fehlerinformationen ausgeben kann.
throw Exception
throw new Exception()
Und mit der try-catch(-finally) Anweisung. Bevor eine Exception durch ein catch abgefangen werden kann, muss diese zuvor durch das Schlüsselwort throw angegeben werden. Der try-Block fasst Anweisungen zusammen, für die eine Ausnahmebehandlung durchgeführt werden soll. Der catch Teil fäng dann bestimmte Exceptions eines bestimmten Typs ab. Der finally Teil wird garantiert ausgeführt, sobald nur eine Anweisung des try-Blocks ausgeführt wurde.
try {
// Anweisungen und Audrücke, die Ausnahmen auslösen können, z.B. throw new Exception()
}
catch (RuntimeException e) {
// Fängt Ausnahmen der Klasse RuntimeException auf
System.out.println("runtime exception");
}
catch (NumberFormatException e) {
// Fängt Ausnahmen der Klasse NumberFormatException auf
System.out.println("number format exception");
}
catch (Exception e) {
// Fängt Ausnahmen der Klasse Exception auf und behandelt sie
System.out.println("other exception");
}
finally {
// Wird ausgeführt, sofern mindestens eine Anweisung aus dem try-Block ausgeführt wurde
System.out.println("'try-catch' finished.");
}
Fazit / Zusammenfassung
Fehlerbehandlung ist ein Thema, welches unter keinen Umständen vernachlässigt werden sollte. Unchecked Exceptions signalisieren Programmierfehler, die nicht zur Laufzeit geprüft werden und deshalb auch nicht behandelt werden sollten. Vor dem Deployment der Software sollten allerdings bestimmte Tests durchgeführt werden, sodass Unchecked Exceptions garnicht erst auftreten. Checked Exceptions zeigen Verfahrensfehler auf und sollten möglichst nahe am Entstehungsort behandelt werden (throw, try-catch). Dadurch arbeitet Software robust und zuverlässig!