Umgang mit Fehlern in C
- Fehlerbehandlung in C
-
Verwenden Sie die globale Variable
errno
-
Verwenden Sie die Funktionen
perror()
undstrerror()
-
Verwenden Sie
EXIT_STATUS
- Abschluss
In diesem kurzen Artikel geht es um die Diskussion verschiedener Möglichkeiten, wie Fehler in Programmen der Sprache C behandelt werden können.
Fehlerbehandlung in C
Obwohl die Fehlerbehandlung (oder Ausnahmebehandlung) von C nicht direkt unterstützt wird, gibt es dennoch Möglichkeiten, Fehler in der Sprache zu behandeln. Ein Programmierer muss die Rückgabewerte von Funktionen testen und versuchen, das Auftreten von Fehlern von vornherein zu verhindern.
Ein kurzer Test auf diese Rückgabewerte ist schnell durchgeführt. Zum Beispiel eine if-Anweisung
, weil viele C-Funktionsaufrufe im Fehlerfall eine -1
oder NULL
zurückgeben.
Verschiedene Methoden können verwendet werden, um verschiedene Arten von Fehlern in der Sprache C zu behandeln. Einige davon werden in diesem Artikel besprochen.
- Verwenden Sie die globale Variable
errno
. - Verwendung der Funktionen
perror()
undstrerror
() in der Sprache C. - Verwenden Sie den Exit-Status der Funktion.
Verwenden Sie die globale Variable errno
In der Bibliotheksdatei errorno.h
ist eine globale Variable errno
definiert. In der Programmiersprache C erhält eine Variable namens errno
automatisch einen Code (Wert), mit dem der aufgetretene Fehler spezifiziert werden kann.
Fehlertypen werden durch unterschiedliche Codes (Werte) für errno
angezeigt. Hier ist eine Liste einiger verschiedener errno
-Werte und ihrer Erklärungen.
Fehlercode | Beschreibung |
---|---|
1 | Dieser Vorgang ist nicht zulässig. |
2 | Datei oder Verzeichnis wurde nicht gefunden. |
3 | Funktion nicht gefunden. |
4 | Jeder Systemaufruf unterbrochen. |
5 | Eingabe- oder Ausgabefehler. |
6 | Kein solches Gerät gefunden. |
7 | Die übergebene Argumentliste ist länger als angegeben. |
8 | Exec-Funktionsfehler. |
9 | Fehler wegen ungültiger Dateinummer. |
10 | Chileprozess nicht gefunden. |
11 | Versuche es noch einmal. |
12 | Speichermangelfehler. |
13 | Die Zugriffsberechtigung wird verweigert. |
Betrachten wir ein Beispielcodesegment, in dem wir versuchen, eine Datei zu öffnen, die nicht existiert. Dann sehen wir den Wert der Variablen errno
.
Codebeispiel:
#include <errno.h>
#include <stdio.h>
int main() {
FILE* file;
// we're trying to open a file that doesn't exist
file = fopen("samepleFile.txt", "r");
printf("The errorno Value is: %d\n ", errno);
return 0;
}
Im obigen Codebeispiel haben wir ein Objekt für File
erstellt und dann die Funktion fopen()
aufgerufen, damit sie eine Datei zum Lesen öffnen kann. Aber wir haben einen Dateinamen angegeben, der nicht im Verzeichnis gefunden wurde.
Es wird also ein Fehler erzeugt und ein errno
-Wert wird gesetzt. Wir werden dann seinen Wert drucken.
Ausgang:
Von der Ausgabe ist die zurückgegebene Fehlernummer 2
. Aus der obigen Tabelle lässt sich ableiten, dass 2
"no such file or directory was found"
bedeutet.
Verwenden Sie die Funktionen perror()
und strerror()
Die aufgetretenen Fehlertypen werden durch den oben erhaltenen Wert errno
angezeigt.
Wird die Fehlerbeschreibung benötigt, kann über zwei Funktionen eine mit der Fehlernummer verknüpfte Textmeldung angezeigt werden. Dies sind perror()
und strerror()
.
-
Die Funktion
perror()
zeigt die benutzerdefinierte Textnachricht für den Fehler an, gefolgt von der eigentlichen Meldung für dieseerrno
.Syntax:
void perror(const char *str)
Der
str
ist die Zeichenfolge für die benutzerdefinierte Nachricht, die Sie vor der eigentlichen Fehlermeldung anzeigen müssen. -
Der
strerror
gibt den Textnachrichtensatz für die ihm übergebeneerrno
zurück.Syntax:
char *strerror(int errnum)
Die
errnum
ist die ihm übergebene Fehlernummer.
Wir modifizieren das vorherige Beispiel zum Öffnen einer nicht existierenden Datei und zeigen die Fehlermeldungen durch perror()
und strerror()
an.
Codebeispiel:
#include <errno.h>
#include <stdio.h>
int main() {
FILE* file;
// we're trying to open a file that doesn't exist
file = fopen("samepleFile.txt", "r");
if (file == NULL) {
printf("Value of error number: %d\n", errno);
perror("Error message by perror");
printf("Error Message from strerror : %s\n", strerror(errno));
`
} else {
fclose(file);
}
return 0;
}
Im obigen Codesegment haben wir den Wert errno
gedruckt, dann die Fehlermeldung mit perror
und dann mit strerror
.
Ausgang:
Verwenden Sie EXIT_STATUS
Um eine erfolgreiche oder nicht erfolgreiche Beendigung anzuzeigen, spezifiziert der C-Standard zwei konstante Makros: EXIT SUCCESS
und EXIT FAILURE
, die an exit()
übergeben werden können. Diese Makros sind in stdlib.h
aufgeführt.
Wir werden das vorherige Beispiel weiter modifizieren und den Fehler-Exit-Aufruf ausführen, wenn die Datei nicht gefunden wird und ein erfolgreicher Exit in der Case-Datei gefunden wird.
Codebeispiel:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE* file;
// we're trying to open a file that doesn't exist
file = fopen("samepleFile.txt", "r");
if (file == NULL) {
int errorNumber = errno;
printf("Value of error number: %d\n", errno);
perror("Error message by perror");
printf("Error Message from strerror : %s\n", strerror(errno));
exit(EXIT_FAILURE);
} else {
fclose(file);
exit(EXIT_SUCCESS);
}
printf("Program exiting");
return 0;
}
Im obigen Codebeispiel haben wir die Exit-Funktion in beiden Fällen der bedingten Anweisung eingefügt. Wir haben eine printf
-Funktion hinzugefügt, kurz bevor das Programm beendet wird.
Diese Meldung wird nicht gedruckt, da das Programm zuvor beendet würde.
Ausgang:
Abschluss
C bietet keine explizite Unterstützung für die Ausnahmebehandlung. Wir können jedoch bestimmte Grundelemente zur Fehlerbehandlung (d. h. Bibliotheksfunktionen) verwenden, um eine ausreichende Ausnahmebehandlung in C zu erreichen.