© StonePictures/Shutterstock.com
Kolumne: Die Golumne

Netter Versuch


Wer kennt es nicht? Man gibt sich Mühe, entwirft, programmiert sorgfältig, testet sowohl manuell als auch automatisch, hat also ein gefühlt perfektes Programm. Und doch kommt es immer wieder zur Laufzeit zu Fehlern. Es sind Dateien beim Öffnen nicht vorhanden, sie haben ein falsches Format, sind wegen fehlender Rechte nicht les- oder schreibbar oder können wegen eines gefüllten Dateisystems nicht geschrieben werden. Gleiches gilt auch für das Netz. Adressen sind nicht zu erreichen, Latenzen zu groß, Zugriff wird nicht gestattet und Verbindungen brechen ab. Datenbanken oder Verzeichnisdienste liefern nicht die gesuchten Daten. Und wenn, dann enthalten sie vielleicht ungültige Werte. Die Liste der möglichen Bedrohungen ist unendlich.

Damit ist das Leben eines Programms ein wilder Dschungel. Es muss natürlich zusehen, einige dieser Fehler selbst zu vermeiden. So muss eine Division by Zero nicht unbedingt sein. Doch wie bereits angedeutet kann der eigene Code nicht immer in Watte gepackt werden, insbesondere bei den erwähnten externen Störungen. Selbst wenn man eine zwar sehr funktionale Bibliothek entwickelt und diese auch besonders sorgfältig dokumentiert hat, ist ihre fehlerhafte Nutzung dennoch immer möglich. Man muss sich also auch um eine Fehlerbehandlung kümmern.

In den guten alten C-Zeiten war es der Return-Code: Unterschiedlich negative Integer-Werte konnten als unterschiedliche Fehler interpretiert werden. Doch das wurde in vielen Sprachen durch ein Exception Handling abgelöst. Funktionen beziehungsweise Methoden können hier bei internen Fehlern ihre eigenen Exceptions werfen sowie auch die Exceptions genutzter Funktionen weiterreichen. Sie können aber auch Anweisungen in einem try-catch-Block einrahmen, um geworfene Ausnahmen intern aufzufangen und als eigene Exception wieder zu werfen. Derartige Ausnahmen kann man sich als spezielle, individuelle Fehlertypen mit eigenen Attributen für mehr Details vorstellen. Die wichtige Idee hinter diesem Mechanismus ist es, den fachlichen Block syntaktisch von der Fehlerbehandlung zu trennen. Verständlich, dass das heute der verbreitetste Weg ist, mit Fehlern umzugehen.

Der Weg in Go

Dann betrat Go die Bühne und mit sich führte es 1A-Exceptions. Oder doch nicht? Stattdessen verfügte es über den Typ error, eigentlich nicht mehr als ein Interface mit der Methode Error() string. Das Package errors und auch eine Funktion in fmt helfen, sie zu erzeugen. Doch können auch eigene Typen implementiert werden, die dieses ...

Exklusives Abo-Special

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang