Fehlerarten und -behandlung
Fehlerarten
1) IO-Error (während Eingabe) | Runtime-Error | System-Error |
---|---|---|
falscher Datentyp | falscher Datentyp | Zu wenig Speicher |
public/private, … falsch definiert | Zu wenig Speicher | Feuer |
Außerhalb Klasse/namespace programmieren | Division durch 0 | HDD-Crash |
SQL-Injection | Logische Fehler (z.B. = anstelle ==) | ....... |
Designfehler: Falsche Vererbung | ||
Syntaxfehler | ||
Programmierer ist für den Fehler verantwortlich. D.h. das Programm muss in geeigneter Weise auf den Fehler reagieren. | Programmierer ist für den Fehler verantwortlich. D.h. das Programm muss in geeigneter Weise auf den Fehler reagieren. | als Programmierer keine Möglichkeit auf diese Fehler zu reagieren |
Es gibt drei Möglichkeiten auf einen Runtime-Fehler zu reagieren:
- Fehlermeldung
Die Fehlermeldung beschreibt den erkannten Fehler.
Beispiele:
- Popup-Fenster, Message-Box
- Töne: Beep-Code, z.B. POST Power On Self Test
- LED, Lampen, ...
- LOG-Dateien, z.B. Ereignisprotokoll unter Windows
- Fehlercode
Eine Funktion liefert im Fehlerfall einen vorher fest definierten Code bzw. Wert zurück.
Beispiele:
- 0 = Alles ok
- -1 = Division durch 0
- -2 = Speicher voll
- -3 = ...
Die Auswertung des Codes ist einfach aber umständlich.
- Exception-Handling
Grundidee: Wenn eine Funktion programmiert wird, die einen Fehler erkennen, aber nicht beheben kann, dann löst sie einen neuen Fehler aus. (Sie erzeugt ein Fehlerobjekt)
Beispiel:
if (Fehler erkannt)
{ throw new Exception("Fehlerbeschreibung"); }
Das throw bewirkt, dass die normale Programmausführung abgebrochen wird. Wenn niemand sich um diesen Fehler "kümmert", stürzt das Programm ab. ("gezielter Programmabbruch")
Ein mit throw ausgelöster Fehler muss gefangen werden "catch". Innerhalb des catch-Befehls erfolgt anschließend die Fehlerbehandlung.
Beispiel:
catch (Exception oExc) { hier steht die Fehlerbehandlung. }
Vor dem Catch muss ein try-Befehl stehen. Die Funktion, die den Fehler auslösen kann, muss innerhalb des Try-Blocks stehen.
try { Befehle, in denen ein throw existiert } catch(Exception oExc) { Fehler behandeln, wenn eine Exception ausgelöst wurde. }
Innerhalb des catch-Befehls erfolgt die Fehlerbehandlung. Aufbau:
catch (Datentyp des Fehlers Fehlerobjekt)
Vor dem catch muss ein try-Befehl stehen. Die Funktion, die den Fehler auslösen kann muss innerhalb des try-Blocks stehen
Beispiel:
void speichern(...) { if(Disk full) throw new Fehler("Disk voll"); fopen, fwrite, ... <= Fehler-Objekt }
Irgendwo im Programm bei der Verwendung der Funktion:
try { ... speichere (.....); ... } catch (Fehler *pZeiger)
Zu beachten: Nach dem Auslösen einer Exception (throw) bricht das Programm den normalen Ablauf ab und arbeitet an dem zugehörigen catch-Block weiter. Dazwischen liegende Befehle werden übersprungen.
Tipps zur Fehlerbehandlung
- nicht hinter jeder Programmzeile einen catch-Block setzen
- niemals eine Exception unterdrücken
- weiterleiten von Fehlern ist keine Schande