EMZETT.
Login

Errors (Fehler)

Kurz: Ein Oberbegriff für alles, was beim Schreiben oder Ausführen eines Programms schiefgehen kann — von Syntaxfehlern, die der Compiler direkt ablehnt, bis zu Laufzeitfehlern, die erst während der Ausführung auftreten.

Genauer: Man unterscheidet grob zwischen Syntaxfehlern (Code verstößt gegen die Grammatik der Sprache, kompiliert gar nicht erst), Logikfehlern (Code läuft, macht aber nicht das Gewollte) und Laufzeitfehlern bzw. Exceptions (ein konkretes Problem während der Ausführung, z. B. Division durch Null). Debugging ist der Prozess, solche Fehler systematisch zu finden und zu beheben.

Im Detail

Die drei Fehlerarten unterscheiden sich vor allem darin, WANN und WIE deutlich sie sich bemerkbar machen:

Syntaxfehler verstoßen gegen die Grammatikregeln der Sprache selbst — eine fehlende Klammer, ein vergessenes Semikolon. Der Compiler bzw. Interpreter erkennt das bereits beim Übersetzen und lässt das Programm gar nicht erst starten. Das ist die harmloseste Fehlerart, weil sie sofort und unübersehbar auffällt, meist sogar schon in der IDE, bevor man das Programm überhaupt ausführt.

Laufzeitfehler (siehe Exceptions) treten erst während der Ausführung auf, wenn eine konkrete, zunächst syntaktisch korrekte Operation scheitert — eine Division durch Null, ein Zugriff auf einen nicht existierenden Array-Index, eine Datei, die nicht gefunden wird. Der Code selbst ist grammatikalisch fehlerfrei, scheitert aber an einer konkreten Situation zur Laufzeit.

Logikfehler sind die tückischsten: Das Programm läuft ohne jede Fehlermeldung durch, produziert aber ein falsches Ergebnis — z. B. eine falsch herum geschriebene Vergleichsbedingung (> statt <) oder eine Berechnung mit einer falschen Formel. Weil kein Fehler geworfen wird, bemerkt man Logikfehler oft erst, wenn ein Ergebnis offensichtlich unplausibel ist, oder gar nicht — das macht sie besonders gefährlich und ist der Hauptgrund, warum Tests (die erwartete gegen tatsächliche Ergebnisse prüfen) so wichtig sind.

// Syntaxfehler: fehlende schließende Klammer -> kompiliert nicht
wenn (bedingung {
    tuEtwas()
}
 
// Laufzeitfehler: läuft, scheitert aber bei bestimmten Eingaben
ergebnis = 10 / eingabe    // Absturz, wenn eingabe == 0
 
// Logikfehler: läuft fehlerfrei durch, Ergebnis ist aber falsch
wenn (alter > 18):          // sollte >= sein, 18-Jährige werden fälschlich ausgeschlossen
    erlaube_zugang()

Die Reihenfolge, in der man diese Fehlerarten typischerweise abarbeitet, spiegelt auch ihre Sichtbarkeit wider: Syntaxfehler zuerst (der Code kompiliert erst gar nicht), dann Laufzeitfehler (das Programm stürzt an einer bestimmten Stelle ab), zuletzt Logikfehler (das Programm läuft, das Ergebnis stimmt nur nicht) — Debugging wird mit jeder Stufe anspruchsvoller, weil weniger direkte Hinweise auf die Fehlerursache vorliegen.

Siehe auch: Exceptions, Debugging, Error Codes