Es ist im Sinne effektiver Programmierung bei den meisten Funktionsaufrufen vorteilhaft zu prüfen, ob die Funktion erfolgreich ausgeführt wurde. Dies kann z.B. wie folgt geschehen:
if(fct(...) == error result){ /* Abfrage auf Fehler-Returnwert */ perror("fct:"); /* Ausgabe von Fehlerinformationen */ exit(error code); /* Reaktion auf den Fehler, hier z.B. */ } /* Programmbeendigung */ else...
Wenn bei der Abarbeitung einer Funktion ein Fehler auftritt, wird dies in den meisten Fällen durch den Returnwert -1 oder den Nullzeiger angezeigt; Einzelheiten sind im Kapitel "Funktionen und Variablen alphabetisch“ zu finden. Sofern dies von der Funktion vorgesehen ist, wird im Fehlerfall zusätzlich die externe Variable errno
gesetzt. Der Wert dieser Variablen ist nur nach dem Aufruf einer Funktion definiert, für die ausdrücklich angegeben wird, dass sie diese Variable besetzt, und bis zu ihrer Änderung durch einen nachfolgenden Funktionsaufruf. Die Variable errno
sollte nur dann überprüft werden, wenn dies durch den Wert des Funktionsergebnisses angezeigt oder jeweils im Abschnitt „Hinweis“ für eine Funktion angegeben ist. Keine Bibliotheksfunktion in diesem Handbuch setzt errno
gleich 0, um einen Fehler anzuzeigen.
errno
wird bei erfolgreichen Funktionsaufrufen nicht zurückgesetzt. Bei einigen Funktionen kann nur durch Prüfen von errno
festgestellt werden, ob die Funktion erfolgreich war.
Auf Grund der in errno
gesetzten Fehlernummer werden intern Daten aufbereitet, die den Fehler näher spezifizieren. Mit der Funktion perror()
kann die Fehlermeldung auf die Standard-Ausgabe ausgegeben werden. Diese Fehlermeldung beinhaltet einen kurzen Fehlertext, der den Fehler erläutert.
Wenn bei der Abarbeitung eines Funktionsaufrufs mehr als ein Fehler auftritt, kann ein beliebiger der von der Funktion vorgesehenen Fehler zurückgeliefert werden, da die Reihenfolge ihrer Entdeckung undefiniert ist.
Alle Fehlernummern, auf die errno
gesetzt werden kann, sowie die dafür vorgesehenen Fehlerinformationen sind in der Include-Datei errno.h
definiert. Eine vollständige Liste finden Sie in errno.h
.
Wenn bei einer Funktion verschiedene Arten von Fehlern und damit Fehlernummern möglich sind, kann es sinnvoll sein, die errno
-Variable auf die Fehlernummer abzufragen, um dann ggf. unterschiedlich darauf reagieren zu können. Jede Fehlernummer wird durch eine in errno.h
definierte symbolische Konstante repräsentiert, z.B. bedeutet ERANGE
Überlauffehler.
Eine Abfrage könnte etwa folgendermaßen aussehen, z.B. hier bei der Funktion signal()
:
#include <errno.h> ... errno = 0; ... if(signal(sig, fct) == 1){ /* Abfrage des Fehlerergebnisses */ if (errno == EFAULT) ... /* Reaktionen auf EFAULT */ else if(errno == EINVAL) ... /* Reaktionen auf EINVAL */ } else...
Der Abschnitt „Fehler“ bei jeder Funktionsbeschreibung im Kapitel "Funktionen und Variablen alphabetisch“ gibt an, unter welchen Bedingungen ein Fehler auftritt.