Fehlerarten und -behandlung

Aus unkompliziert.eu
Wechseln zu: Navigation, Suche

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, ...
  • E-Mail
  • 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