Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Behandlung von Fehlern

&pagelevel(3)&pagelevel

Es ist im Sinne effektiver Programmierung vorteilhaft, bei Funktionsaufrufen zu prüfen, ob die Funktion erfolgreich ausgeführt wurde. Dies kann etwa wie folgt geschehen:

if(fkt(...) == fehlerergebnis)  /* Abfrage auf Fehler-Returnwert */
  {
    perror("fkt:");             /* Ausgabe von Fehlerinformationen */
    exit(fehlercode);           /* Reaktion auf den Fehler, hier z.B. */
  }                             /* Programmbeendigung */
else...

Die meisten Funktionen liefern bei Auftreten eines Fehlers einen Fehler-Returnwert.Zusätzlich wird in vielen Fällen die C-interne Variable errno (Typ integer) auf einen entsprechenden Fehlercode gesetzt. Auf Grund dieses Fehlercodes werden dann intern (in einer Struktur) Informationen aufbereitet, die den Fehler näher spezifizieren. Die von der Funktion perror ausgegebene Information beinhaltet:

  • einen kurzen Fehlertext, der den Fehler erläutert,

  • den Namen der Funktion, bei der der Fehler aufgetreten ist,

  • ggf. den DVS-Fehlercode (sedezimal) bei fehlerhaften Dateizugriffen.

Alle Fehlercodes sowie die dafür vorgesehenen Fehlerinformationen sind in der Include-Datei <errno.h> definiert.

Wenn bei einer Funktion verschiedene Arten von Fehlern und damit Fehlercodes möglich sind, kann es sinnvoll sein, die errno-Variable auf den Fehlercode abzufragen, um dann ggf. unterschiedlich darauf reagieren zu können. Jeder Fehlercode wird durch eine in <errno.h> definierte symbolische Konstante repräsentiert, z.B. bedeutet ERANGE Überlauffehler (Wert 2). Eine Abfrage könnte etwa folgendermaßen aussehen, z.B. hier bei der Funktion signal:

#include <errno.h>
       .
       .
if(signal(sig, fkt) == 1) /* Abfrage des Fehlerergebnisses */
{
  if(errno == EFAULT)
       .           /* Reaktionen auf EFAULT (unzulässige Adresse) */
       .
  else if(errno == EINVAL)
       .           /* Reaktionen auf EINVAL (unzulässiges Argument) */
       .
}
else...

Zusätzlich zur errno-Variablen sind in der Include-Datei <errno.h> zwei weitere Variablen definiert:

Mit __errcmd ist der Name der fehlerhaften Funktion ansprechbar und mit __errhex der sedezimale DVS-Code. Beide Variablen sind vom Typ char[8].

Hinweise

  • Die Variablen errno, __errcmd und __errhex dürfen nicht explizit vom Anwender definiert werden. Für die Abfrage dieser Variablen muss die Include-Datei <errno.h> in das Programm übernommen werden.

  • Der Inhalt des Bereichs, in dem Fehlerinformationen intern abgespeichert werden, bleibt solange erhalten, bis er bei neuerlichem Auftritt eines Fehlers mit der aktuellen Information überschrieben wird. perror-Aufrufe sowie die Abfrage der Variablen errno, __errcmd und __errhex sind daher nur sinnvoll, unmittelbar nachdem eine Funktion einen Fehler-Returnwert geliefert hat.

In den Beispielen zu den einzelnen Funktionsbeschreibungen wurden die Fehlerabfragen häufig weggelassen, um die Beispiele nicht unnötig aufzublähen.