Im Gegenzug gibt es bei Cardinal aber auch 2 Milliarden Werte, die es technisch niemals geben kann. ( >2 GB )
Schon klar,
aber ich brauche dann nur < Length() zu prüfen, was ich sowieso tun muss, und da schliesst sich der Kreis
Zu dem Fail-first:
Es ist vieleicht die Frage was man als Fehler definiert, und was nicht.
Bei Div0 ist das ja klar.
Aber zum Beispiel könnte ein Ignorieren bei < 0 Teil der Funktion sein,
so dass man abhängig von einem Ergebnis eine Funktion auslösen kann.
Mal als Beispiel eine CutLeft Funktion (sorry, ist schon spät, mir fällt momentan nichts Besseres ein).
Delphi-Quellcode:
procedure CutLeft( var AArray : TBytes; const ACutCount : Integer );
var LTemp : TBytes;
begin
if (ACutCount > 0) and (Max(ACutCount, Length(AArray)) <= Length(AArray)) then
begin
SetLength( LTemp, Length( AArray )- ACutCount );
if Length( LTemp ) > 0 then
System.Move( AArray[ 0 ], LTemp[ 0 ], Length( LTemp ) );
AArray := ATemp;
end;
end;
Die kann ich Anwenden von 1 bis MaxInt, und schneidet entsprechend viele Left-Zeichen raus.
Negative Werte werden ignoriert.
Ich kann die Anwenden mit Berechnungen, wie
Delphi-Quellcode:
var
LValue : TBytes;
LPos : Integer;
begin
LValue := Xyz;
...
LPos := FindCut( LValue, CutSequence );
...
LPos := LPos + 3; // Berechne CutPosition
CutLeft( LValue, LPos ); //<== Ich kann mich drauf verlassen das nichts Ungewolltes passiert
oder
LPos := LPos - 3; // Berechne CutPosition
CutLeft( LValue, LPos ); //<== Ich kann mich drauf verlassen das nichts Ungewolltes passiert
end;
Das Ergebnis ist immer korrekt ( aus meiner Sicht ) kein Grund hier irgendwelche "
Exception" zu werfen.
Das Ergebnis ist entweder leer oder das gesamte Array, mögliche Überläufe werden ignoriert.
Wenn ich die Überläufe Vermeiden oder Erkennen muss, dann kann ich ganz simpel im Aufrufer LPos checken,
sowas in der Art meinte ich.
Die Funktion selbst ins intrinsisch resilient gegen irgendwelche Über/Unterläufe,
und ich kann mich auf das Ergebnis verlassen und z.B. ohne weitere Prüfungen weiterverarbeiten.
Falls da ein LPos-1 OffsetFehler drin sein sollte, dann hilft mir eine scharfe Abfrage doch auch nicht weiter.
Es gibt sicher Funktionen wo ich die scharfe Prüfung explizit möchte, das ist richtig, und die darf "
Exception" werfen.
Ich denke es kann auch gute Gründe für eine "ignorante" Funktion geben