Werfen eine Ausnahme in C

Waqar Aslam 12 Oktober 2023
  1. eine Übersicht der Ausnahmen
  2. Behandeln eine Ausnahme in der Programmiersprache C
  3. die Funktion setjmp() zur Behandlung von Fehlern in C
  4. Fehlerbehandlung mit errno in C implementieren
  5. Verwenden Sie perror() und strerror(), um die Fehlermeldungen zu drucken
  6. Umgang mit Division durch Null Fehlern
Werfen eine Ausnahme in C

In diesem Artikel wird erläutert, wie Sie mit einer Ausnahme oder einem Fehler in der Programmiersprache C umgehen.

eine Übersicht der Ausnahmen

Der Versuch, durch Null zu dividieren, ist ein Beispiel für eine Situation, die eine Ausnahme auslösen kann, die eine Reaktion auf ein außergewöhnliches Szenario ist, das während der Ausführung eines Programms auftreten kann.

Mit Hilfe einer Ausnahme kann die Kontrolle von einem Programmabschnitt an einen anderen übergeben werden.

Behandeln eine Ausnahme in der Programmiersprache C

Auch wenn C keine direkte Unterstützung für die Fehlerbehandlung (auch Ausnahmebehandlung genannt) bietet, gibt es Methoden, mit denen die Fehlerbehandlung in C durchgeführt werden kann. Um Probleme von vornherein zu vermeiden, muss ein Programmierer Vorkehrungen treffen und die zurückgegebenen Werte untersuchen durch die Funktionen.

Viele Aufrufe von C-Funktionen liefern im Fehlerfall den Wert -1 oder NULL zurück. Daher kann die Durchführung eines Schnelltests an diesen Rückgabewerten schnell und effizient durchgeführt werden, indem beispielsweise eine if-Anweisung verwendet wird.

die Funktion setjmp() zur Behandlung von Fehlern in C

Die Simulation der Ausnahmebehandlungsfunktionalität anderer Programmiersprachen ist mit der Funktion setjmp() möglich. Beim ersten Aufruf von setjmp() wird ein Referenzpunkt zum aktuellen Punkt in der Programmausführung gespeichert.

Dieser Referenzpunkt bleibt gültig, solange die Funktion, die setjmp() enthält, nicht zurückkehrt oder beendet wird. Wenn Sie longjmp() aufrufen, kehrt die Ausführung zu dem Punkt zurück, an dem der entsprechende setjmp()-Aufruf erfolgte.

Der Parameter von setjmp() ist jmp buf, was ein Typ ist, der einen Ausführungskontext enthalten kann, und er gibt 0 zurück, wenn er das allererste Mal ausgeführt wird (wenn er den Rückkehrpunkt setzt). Der an longjmp() gelieferte Wert wird dann zurückgegeben, wenn das Programm zum zweiten Mal ausgeführt wird, wenn longjmp() aufgerufen wird.

Als Input für longjmp() wird ein zuvor an setjmp() übergebenes jmp buf benötigt, zusammen mit einem Wert, der als Rückgabewert an setjmp() übergeben werden soll.

Wenn in tief verschachtelten Funktionsaufrufen Fehler auftreten, wäre es mühsam, die Rückgabewerte an der Stelle zu überprüfen, an die Sie zurückkehren möchten. Hier sind setjmp() und longjmp() am nützlichsten.

Quellcode:

#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int value;
  jmp_buf environment;

  value =
      setjmp(environment);  // value is set to 0 the first time this is called

  if (value != 0) {
    printf("You have just executed a longjmp call, and the return value is %d.",
           value);  // now, value is 1, passed from longjmp()
    exit(0);
  }

  puts("Performing longjmp call\n");
  longjmp(environment, 1);

  return (0);
}

Ausgang:

Performing longjmp call

You have just executed a longjmp call, and the return value is 1

Fehlerbehandlung mit errno in C implementieren

Wenn ein Funktionsaufruf in C ausgeführt wird, erhält eine als errno bezeichnete Variable automatisch einen Code (Wert), der verwendet werden kann, um das aufgetretene Problem zu bestimmen. Dieser Code kann verwendet werden, um festzustellen, wo der Fehler aufgetreten ist.

Es ist eine globale Variable, die Ihnen mitteilt, welche Art von Fehler aufgetreten ist, wenn Sie eine Funktion aufgerufen haben, und sie wird in der Header-Datei errno.h angegeben. Fehler verschiedener Art werden durch eindeutige Codes oder Werte für die Variable errno gekennzeichnet.

Das Folgende ist eine Liste mit vielen unterschiedlichen errno-Werten, die jeweils einer bestimmten Bedeutung entsprechen.

errno Wert Fehlermeldung
1 Operation unzulässig
2 Keine solche Datei oder Verzeichnis
3 Kein solches Verfahren
4 Unterbrochener Systemaufruf
5 E/A-Fehler
6 Kein solches Gerät oder Adresse
7 Argumentliste zu lang
8 Exec-Formatfehler
9 Falsche Dateinummer
10 Keine untergeordneten Prozesse
11 Versuchen Sie es erneut
12 Aus dem Gedächtnis
13 Zugriff verweigert

Quellcode:

#include <errno.h>
#include <stdio.h>

int main() {
  FILE* fp;

  fp = fopen("abc.txt", "r");

  printf("The value of errno is: %d\n", errno);

  return 0;
}

Ausgang:

The value of errno is: 2

In diesem Fall wird errno auf 2 gesetzt, was bedeutet, dass es weder eine Datei noch ein Verzeichnis mit diesem Namen gibt.

Verwenden Sie perror() und strerror(), um die Fehlermeldungen zu drucken

Die Art der aufgetretenen Fehler wird durch den oben erhaltenen Wert errno angezeigt.

Wenn es notwendig ist, die Fehlerbeschreibung anzuzeigen, können zwei Funktionen verwendet werden, um eine Textnachricht anzuzeigen, die mit der Fehlernummer verbunden ist.

perror() zeigt die von Ihnen angegebene Zeichenfolge an, fügt ein Leerzeichen ein, dann den Doppelpunkt und beschreibt schließlich den errno-Wert. Das strerror() bezieht sich auf die Beschreibung des aktuellen Werts von errno.

Quellcode:

#include <errno.h>
#include <stdio.h>
#include <string.h>

int main() {
  FILE *fp;
  fp = fopen(" abc.txt ", "r");

  printf("The value of errno is: %d\n", errno);
  printf("The error message is: %s\n", strerror(errno));
  perror("perror Message");

  return 0;
}

Ausgang:

The value of errno is: 2
The error message is: No such file or directory
Message from perror: No such file or directory

Umgang mit Division durch Null Fehlern

Beim Umgang mit Fehlern oder Ausnahmen ist dies bei weitem das häufigste Problem, das zur Diskussion gestellt wird.

Häufig werden wir mathematische Aussagen präsentieren wie:

c = a / b;

Aber wir vergessen oft, dass der Wert von b unter Umständen wahrscheinlich null sein wird.

Die Division einer ganzen Zahl durch Null ist in der Mathematik nicht erlaubt. Die Leute glauben oft, dass die Lösung niemals erreicht werden kann, was bedeutet, dass die Lösung unendlich ist.

Leider ist dies nicht der Fall. In diesem speziellen Szenario lautet die richtige Antwort nicht angegeben. Unter Verwendung der Prinzipien der Verwaltung von Ausnahmen und Fehlern in C ist das folgende Programm, das dieses Problem löst.

Quellcode:

#include <stdio.h>
#include <stdlib.h>

int main() {
  int dividend;
  int divisor;
  int quotient;

  printf("Enter the value for dividend: ");
  scanf("%d", &dividend);

  printf("Enter the value for divisor: ");
  scanf("%d", &divisor);

  if (divisor == 0) {
    fprintf(stderr, "\nDivision by zero is not possible!\n");
    exit(-1);
  }

  quotient = dividend / divisor;
  fprintf(stderr, "The value of quotient: %d\n", quotient);
  exit(0);
  return 0;
}

Ausgang:

Geben Sie einen Null-Wert ein.

Enter the value for dividend: 100
Enter the value for divisor: 0

Division by zero is not possible!

Geben Sie einen Nicht-Null-Wert ein.

Enter the value for dividend: 100
Enter the value for divisor: 5
The value of quotient: 20
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn

Verwandter Artikel - C Exception