Murphy lauert überall
Sie kennen vielleicht Murphy' s Law: "Alles, was schiefgehen kann, wird auch irgendwann schiefgehen."
Seien Sie sich dessen immer bewusst und gehen Sie von vornherein davon aus, dass ein Aufruf in Ihrem Code daneben gehen kann.
Das bedeutet, dass Sie Rückgabewerte von Funktionen auswerten und Exceptions abfangen sollten, wo immer sich diese Möglichkeit bietet.
Als Resultat erhalten Sie mit ziemlicher Sicherheit ein stabileres Kompilat, das nicht gleich beim ersten unvorhergesehenen Fehler in die Knie geht.
So sollten Sie beispielsweise als Delphi-Programmierer mit einer halbwegs aktuellen Delphi-Version die ganzen StrToXXX-Konvertierungsfunktionen komplett aus Ihrem Wortschatz verbannen, da es stabilere Alternativen dafür gibt (StrToXXXDef oder TryStrToXXX, je nach Anwendungsfall).
Wie üblich wieder Beispiele:
Wie können wir diesen Lapsus beheben?
Spontan fallen mir da 2 Möglichkeiten ein:
So sollten Sie beispielsweise als Delphi-Programmierer mit einer halbwegs aktuellen Delphi-Version die ganzen StrToXXX-Konvertierungsfunktionen komplett aus Ihrem Wortschatz verbannen, da es stabilere Alternativen dafür gibt (StrToXXXDef oder TryStrToXXX, je nach Anwendungsfall).
Wie üblich wieder Beispiele:
Beispielcode 1:
procedure TFormBla.DoSomething(Data: array of string); var i: integer; begin i := 0; repeat if Data[i] = 'Hallo Welt' then DoSomethingCompletelyDifferent(Data[i]); inc(i); until i > High(Data); end;Auf den ersten Blick könnten Sie vielleicht denken: "Was will der denn, ist doch astreiner Code?" Leider ist er das eben nicht. Der Programmierer geht hier davon aus, dass das übergebene Array Data mindestens ein Element enthält. Was aber, wenn dem einmal nicht so ist? Sie können sich vermutlich vorstellen, was dann innerhalb der Schleife geschieht.
Wie können wir diesen Lapsus beheben?
Spontan fallen mir da 2 Möglichkeiten ein:
- Abprüfen der Länge des Arrays vor Schleifeneintritt
- Wechsel von der Fuß- zu einer Kopfschleife
Beispielcode 2:
procedure TFormBla.DoSomething(Data: array of string); var i: integer; begin for i := Low(Data) to High(Data) do if Data[i] = 'Hallo Welt' then DoSomethingCompletelyDifferent(Data[i]); end;Hier wird die Schleife gar nicht erst durchlaufen, wenn ein leeres Array übergeben wird. Somit kann nicht auf nicht existente Array-Elemente zugegriffen werden.