Umgang mit Fehlern in C

Naila Saad Siddiqui 15 Februar 2024
  1. Fehlerbehandlung in C
  2. Verwenden Sie die globale Variable errno
  3. Verwenden Sie die Funktionen perror() und strerror()
  4. Verwenden Sie EXIT_STATUS
  5. Abschluss
Umgang mit Fehlern in C

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.

  1. Verwenden Sie die globale Variable errno.
  2. Verwendung der Funktionen perror() und strerror() in der Sprache C.
  3. 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:

Ausgabe des Demoprogramms errno

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 diese errno.

    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 übergebene errno 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:

perror- und strerror-Ausgabe

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:

Ausgangswertausgabe

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.

Verwandter Artikel - C Error