16.22 Fehlerbehandlung 

Wenn bei einem Systemaufruf ein Fehler auftritt, wird in der globalen Variable errno ein entsprechender Fehlerwert gesetzt. Mit den beiden Funktionen strerror() und perror() können Sie diese Systemfehlermeldung ausgeben lassen. Die Variable errno ist in der Headerdatei <errno.h> definiert.
Dabei ist es nicht vorgeschrieben, ob errno eine globale Variable (vom Typ int) oder ein Makro ist, das einen modifizierbaren L-Wert vom Typ int hat.
Ebenfalls in der Headerdatei <errno.h> sind die Konstanten (Fehlernummern) deklariert, die die Variable errno annehmen kann. Jede dieser Konstanten beginnt mit dem Großbuchstaben »E«. Diese Fehlernummern sind allerdings, abgesehen von drei Konstanten, system- und compiler-abhängig. Tabelle 16.9 enthält die drei Konstanten, die auf allen Systemen gleich und vorhanden sind.
Konstante | Bedeutung |
EDOM |
(Domain error) unzulässiges Argument für eine mathematische Funktion |
EILSEQ |
(Illegal sequence) Bei einer Verarbeitung von Multibyte-Zeichen wurden Bytes entdeckt, die keine gültigen Zeichen darstellen. |
ERANGE |
(Range error) Das Ergebnis liegt außerhalb des darstellbaren Bereichs. |
Weitere – allerdings wie schon erwähnt, system- und compiler-abhängige – Konstanten und ihre Bedeutungen sind in Tabelle 16.10 aufgeführt.
Fehlercode | Bedeutung |
EZERO |
Fehler 0 |
EINVFNC |
ungültige Funktionsnummer |
ENOFILE |
Datei nicht gefunden |
ENOPATH |
Pfad nicht gefunden |
ECONTR |
Speicherblöcke zerstört |
EINVMEM |
ungültige Speicherblockadresse |
EINVENV |
ungültiges Environment |
EINVFMT |
ungültiges Format |
EINVACC |
ungültiger Zugriffscode |
EINVDAT |
ungültige Daten |
EINVDRV |
ungültige Laufwerksangabe |
ECURDIR |
Versuch, das aktuelle Verzeichnis zu löschen |
ENOTSAM |
nicht das gleiche Gerät |
ENMFILE |
keine weiteren Dateien mehr |
ENOENT |
Datei oder Verzeichnis existiert nicht. |
EMFILE |
zu viele geöffnete Dateien |
EACCES |
Zugriff verweigert |
EBADF |
ungültiger Datei-Deskriptor |
ENOMEM |
zu wenig Speicher |
ENODEV |
Gerät existiert nicht. |
EINVAL |
ungültiges Argument |
E2BIG |
Argumentliste ist zu lang. |
ENOEXEC |
Fehler beim Exec-Format |
EXDEV |
Kreuzverbindung von Geräten |
EFAULT |
unbekannter Fehler |
EEXIST |
Datei existiert bereits. |
Dies dürften jetzt nicht alle gewesen sein bzw. auf anderen Systemen wieder zu viele. Sie sollten in der Headerdatei <errno.h> oder unter Linux auf der Manpage intro nachsehen.
Die Variable errno wird beim Programmstart normalerweise auf 0 gesetzt, da es keine Fehlernummer mit dem Wert 0 gibt. Deshalb sollte errno jedes Mal, wenn eine Systemfunktion aufgerufen wird, wieder auf 0 gesetzt werden.
16.22.1 Fehlerausgabe mit »perror()« 

Im ersten Beispiel wird die Funktion perror() verwendet. Sehen sie sich zuerst die Syntax zu dieser Funktion an:
#include <stdio.h> void perror(const char *meldung);
Wenn für meldung kein NULL-Zeiger angegeben wurde, wird der String meldung mit anschließendem Doppelpunkt, gefolgt von einer zu errno gehörenden Fehlermeldung, ausgegeben (mit abschließendem '\n'). Rufen Sie hingegen diese Funktion mit dem NULL-Zeiger auf, wird nur eine zu errno gehörende Fehlermeldung ausgegeben. Geschrieben wird diese Fehlermeldung auf die Standardfehlerausgabe (stderr).
/* perror.c */ #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; fp = fopen("keinedatei.dat", "r"); if (NULL == fp) { perror("Kann nicht aus Datei lesen "); return EXIT_FAILURE; } return EXIT_SUCCESS; }
Das Programm versucht, die Datei keinedatei.dat zu öffnen. Falls diese nicht existiert, wird eine entsprechende Fehlermeldung ausgegeben:
Kann nicht aus Datei lesen : No such file or directory
Der Funktion perror() kann auch ein NULL-Zeiger übergeben werden:
perror(NULL);
In diesem Fall würde nur das Folgende ausgegeben:
No such file or directory (ENOENT)
16.22.2 Fehlerausgabe mit »strerror()« 

Das Gleiche soll jetzt auch mit der Funktion strerror() realisiert werden. Die Syntax der Funktion lautet:
#include <string.h> char *strerror(int error_nr);
Die Funktion liefert als Rückgabewert einen Zeiger auf einen String, der zur Systemfehlermeldung der Variablen errno passt. Der Parameter error_nr beinhaltet in der Regel die Fehlervariable von errno.
/* strerror.c */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> int main(void) { FILE *fp; fp = fopen("keinedatei.dat", "r"); if (NULL == fp) { fprintf(stderr, "%s\n", strerror(errno)); return EXIT_FAILURE; } return EXIT_SUCCESS; }
Das Programm läuft genauso ab wie das Programm zuvor mit perror().
Mit dem nun folgenden Programm wird eine Datei mit dem Namen testfile erstellt. Zuerst soll die Datei zum Lesen geöffnet werden. Anschließend wird mit
if(errno == ENOENT)
überprüft, ob die Variable errno den Wert der Konstante ENOENT hat. Wenn ja, bedeutet dies, dass keine solche Datei existiert, und sie soll somit neu angelegt werden. Sollte es Probleme beim Anlegen dieser Datei geben, so wird dies mit dem nächsten perror()-Aufruf ausgegeben.
/* isfile.c */ #include <stdio.h> #include <stdlib.h> #include <errno.h> #define ESUCCESS 0 int main(void) { FILE *fp; fp = fopen("testfile", "r"); if(errno == ENOENT) { /* errno wieder zurücksetzen */ errno = ESUCCESS; fp = fopen ("testfile", "w"); if(NULL == fp) { perror(NULL); return EXIT_FAILURE; } else printf("Datei \"testfile\" angelegt\n"); } else printf("Datei \"testfile\" exisitiert bereits\n"); fclose(fp); return EXIT_SUCCESS; }
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.