hustbaer schrieb:
Neh, da prallen keine zwei Philosophien aufeinander. Ich rede von Laufzeitfehlern. Exceptions sollten für Laufzeitfehler verwendet werden. Jeder Zugriff auf die Hardware z.B. kann daneben gehen, und ich möchte nicht dass mein Programm einfach so ohne Meldung abschmiert weil das Diskettenlaufwerk am sterben ist oder ein File nicht gefunden wurde etc.
Lies mein vorheriges Posting nochmal. Daten in einem gültigen Format vorliegen haben, dann keine überflüssigen Abfragen mehr.
Daten, die ich nicht vorliegen habe, ... da brauche ich mir auch keine Gedanken machen, ob die gültig sein könnten.
Weiterhin ist das Nicht-Auffinden von Daten keine derartige Besonderheit, dass es eine Exception erfordern würde.
Eine Exception könnte ich akzeptieren, wenn das Laufwerk während des Lesens verschwindet, weil jemand über das USB-Kabel gestolpert oder das Netzwerk zusammengebrochen ist.
Wenn man Exceptions vermeidet, heißt das schließlich nicht, dass es kein Error-Handling gibt.
Genauso werden Usereingaben geprüft - bevor sie in einen Algorithmus wandern. Der Algorithmus wird mit falschen Werten gar nicht erst belastet.
hustbaer schrieb:
Mich würde es doch sehr stören wenn ein Programm einfach 42 als Lösung ausspuckt, ohne Fehlermeldung, als ob alles glatt gegangen wäre, wenn doch die richtige Lösung 100 ist. Als Beispiel. Ohne error checking kann dir genau das passieren. Weiss nicht ob das so toll ist.
Das kann Dir mit Prüfungen genauso passieren. Fehlerhafte Algorithmen werden nicht besser, wenn sie durch dauernde Prüfungen verlangsamt werden.
Daten, die ungültig sind und das Ergebnis verfälschen, werden vorher abgefangen. Da ist das Error-Checking.
Kompliziertere Alrithmen müssen in ihren möglichen Wegen getestet werden. Welche Eingaben sind möglich, wieviele Fälle treten auf, ist für jeden Fall ein Testfall mit bekannter Lösung vorhanden?
Dann wird mit den Daten gerechnet - ohne Error-Checking. Kommt dann 42 statt 100 raus, hat das Programm einen Bug. Da helfen auch Prüfungen nichts mehr. Das kann Dir genauso gut mit 20000 zusätzlichen Abfragen passieren. Ein paar Asserts beim Testen gerne. Aber wenn das Programm ausgeliefert wird, ist es entweder korrekt - oder buggy.
Mit oder ohne Abfragen.
Ich habe auch nichts gegen Abfragen, im Algorithmus - wenn sie notwendig sind.
Aber die berühmte Wurzel, die prüft ob der Parameter negativ ist, interessiert mich nicht.
Wenn ich z.B. eine Vektorlänge berechne ist es absolut unmöglich, dass ich aus einer negativen Zahl die Wurzel ziehe. Berechne ich ein paar Millionen Vektoren, sind das ein paar Millionen überflüssiger Abfragen. Ich will nicht, dass sqrt() meine Eingabe prüft in Fällen, wo dies nicht nötig ist.
Wenn mein Algorithmus negative Zahlen ausspucken kann und diese Zahlen sqrt() übergibt, dann ist mein Algorithmus dafür verantwortlich, wenn da Müll rauskommt - nicht sqrt().
Dann muss mein Algorithmus an dieser das prüfen und gegebenfalls die Information zurückliefern, wenn was schlief läuft. Dafür habe ich mir vorher Gedanken gemacht, welche Wege meine Funktion gehen kann und in welchem Wertebereichen sich die Variablen befinden können.
Aber eine Abfrage an der richtigen Stelle reicht, das muss nicht in jeder Funktion geprüft werden.
Das kann man als Entwickler gerne mit einer speziellen Debug-Version der entsprechenden Libs prüfen, aber der fertige Algorithmus darf keine Sicherheitsleinen mehr brauchen, sondern garantiert in exakt definierten Bahnen verlaufen.