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 Variablenerrno
,__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.