Programmierfehler managen?

...komplette Frage anzeigen

8 Antworten

Nein,

wie soll denn diese Schaltung oder dieses Programm wissen, was ein Programmierfeher ist, und was absichtlich so programmiert wurde?

In den 80er-Jahren des vergangenen Jahrtausends gab es kurzfristig das Bestreben, Compilern eine Intelligenz zu verleihen und sie fehlertolerant zu machen. Bei Syntax-Fehlern sollten sie also "erraten", was der Programmierer wohl bezwecken wollte und den Code dementsprechend compilieren.

Davon kam man schnell wieder ab, da dies alles nur schlechter machte und Fehler verschleierte.

Wenn es also schon schwierig ist (egal ob für Maschine oder für Mensch), bei offensichtlichen Fehlern (Syntax) zu entscheiden, was denn richtig (also auch im Sinne des Programmierers, nicht nur im Sinne der Syntax) ist, wie will man denn dann bei nicht sichtbaren Fehlern "korrigierend" eingreifen?

Würde das funktionieren, würde schlampiger programmiert werden und "unerklärliche" Programmabläufe würden rapide zunehmen.

Mich würd es gruseln, wenn ein Programm, das ich geschrieben habe, plötzlich etwas anderes macht als von mir programmiert, nur weil irgendein Maschinenteil "denkt" es sei besser so.

Nein!

Ein Prozessor arbeitet die Befehle genau so ab wie sie kommen.

Bei der Programmierung kann der sog. Compiler auch nur auf syntaktische  Fehler reagieren, also ob dien Befehl richtig geschrieben wurde, Schleifen richtig abgeschlossen sind und Datenstrukturen stimmen.

Aber logische Fehler, dass z.B. Wertebereiche von Zahlen überschritten werden während das Programm läuft (sog. Laufzeitfehler), zu erkennen das geht nicht.

Naaajaaa ... du kannst in begrenztem Maße Rückgabewerte prüfen, mit Exceptions arbeiten, Signale abfangen, zur Not auch einen eigenen Memory-Manager verwenden, der bei einem Fehler einen Handler aufruft, etc.

Aber ehrlich gesagt ist es (fast) immer besser, einen fehlerhaften auf natürliche Art sterben zu lassen.

Während des Testens sollte die Umgebung auf etwaige Fehler achten, und z. B. eine Umgebung zum Auffinden von Speicherlecks Alarm schlagen, wenn du über das Ende eines Puffers schreibst.

Ein fehlerhaftes Programm wird sich in den meisten Fällen nicht selbst zuverlässig retten können. Du kannst zwar SIGFPE oder sogar SIGSEGV erfolgreich abfangen und innerhalb deines Handlers (auf dem speziellen sehr kleinen Signalstack) kurzzeitig weiter machen, aber eine Rückkehr aus dem Handler selbst ist unmöglich, da das selbe Signal sofort wieder ausgelöst würde.

Logikfehler hingegen lassen sich sehr schick - wie bereits erwähnt - mit Ausnahmen abfangen.

Ansonsten ist mir nicht ganz klar, was genau du wissen möchtest. :)

In begrenztem Maße ja, aber nicht so, wie du dir das vermutlich vorstellst.

Z.B. wird bei heutigen Betriebssystemen verhindert, dass ein Programm außerhalb des ihm zugewiesenen Speicherbereichs liest oder schreibt. Dann wird das Programm abgebrochen, damit es keinen Schaden anrichten kann.

Es findet aber keine automatische Berichtigung statt, wie ja auch schon einige andere hier geschrieben haben.

Was ist für dich ein Programmierfehler? Das müsste auch das Programm wissen. (Syntax kann man versuchen, Inhalt zu verbessern geht nicht)

Wenn man programmiert, dann hilft ein Debugger (Teil des Programmierpakets), um Fehler aufzuspüren.

Moderne IDEs weisen dich auf Stellen hin, an denen öfter mal Fehler passieren können. Doch Bugs erkennen kann nur der Programmierer. Woher soll die Maschine wissen, was der Programmierer haben will?

In Programmiersprachen gibt es normalerweise eine Fehlerbehandlungsmöglichkeit.

In Basic ist es die ganze Sache um 'on error goto ...'. Damit wird ein Fehler abgefangen.

Was möchtest Du wissen?