Programmiersprache C/C++

Fehlermeldungen

perror

  #include <stdio.h>

  void perror( const char *string );
perror kann zum Erzeugen von (englischen) Fehlermeldungen verwendet werden.
string ist der vom aufrufenden Programm festgelegte Teil der Fehlermeldung.

Die Routine gibt die folgenden Daten über stderr aus:

Wird für string der Wert NULL oder ein Zeiger auf einen Nullstring angegeben, dann beschränkt sich perror auf die Ausgabe der eigentlichen Fehlermeldung, d.h. es läßt den Doppelpunkt und das darauffolgende Leerzeichen weg.

Die möglichen Werte von errno sowie die zugehörigen (englischen) Fehlertexte werden in ANSI-C in der Datei errno.h deklariert.

Da errno durch einen großen Teil der Routinen der Laufzeitbibliothek neu gesetzt wird, sollte perror unmittelbar nach der Erkennung eines Fehlers aufgerufen werden: Ein Programm, das an dieser Stelle erst noch andere Routinen "dazwischenschiebt", läuft Gefahr, daß diese errno verändern.

Einige Fehlercodes sind standardisiert, andere sind systemspezifisch (unter Unix gibt es eine gewisse Standardisierung).

Rückgabewert: keiner

Beispiel:

  FILE *fr;
  char in_file[] = "daten.dat";

  if ( ( fr = fopen(in_file, "r") ) == NULL ) {
   perror(in_file);
   exit(1);
  }
Ein mit Microsoft C übersetztes Programm liefert im Fehlerfall:
  daten.dat: No such file or directory
Gnu C unter DOS liefert:
  daten.dat: file not found

strerror

  #include <string.h>

  char *strerror( int errnum );
Die Routine strerror läßt sich von Programmen zum Erzeugen von (englischen) Fehlermeldungen verwenden.
errnum ist ein ganzzahliger Fehlercode, ausgegeben wird die zugehörige Fehlermeldung.

Beispiel:

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

  int main(void)
  {
    printf("%s\n", strerror(ERANGE));
    printf("%s\n", strerror(EDOM));

    return 0;
  }
ERANGE und EDOM sind in ANSI-C vorgesehene Fehlercodes, weitere Fehlercodes sind systemspezifisch.
Microsoft Visual C++ 1.0 besitzt z.B. folgende Codes:
ECHILD, EAGAIN, E2BIG, EACCES, EBADF, EDEADLOCK, EDOM, EEXIST, EINVAL, EMFILE, ENOENT, ENOEXEC, ENOMEM, ENOSPC, ERANGE, EXDEV.

Wird das obige Programm mit Microsoft C übersetzt, so liefert es

  Result too large
  Math argument
Rückgabewert:
strerror liefert einen Zeiger auf einen statischen Stringpuffer zurück, der durch jeden Aufruf der Funktion neu gesetzt wird. Wenn errno auf einen Wert außerhalb des vorgesehenen Bereichs besitzt, enthält dieser Puffer anstelle der Systemfehlermeldung einen Nullstring.


Beispiel:

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

  int main(void)
  {
    double x, y;

    x = 1.0;
    y = sqrt(x);
    if ( errno )
      perror("sqrt");
    else
      printf("sqrt(%f) = %f\n", x, y);

    x = -x;
    y = sqrt(x);
    if ( errno )
      perror("sqrt");
    else
      printf("sqrt(%f) = %f\n", x, y);

    return 0;
  }
Ausgabe:
  gcc unter Solaris 2.3 auf Sparc-Rechner
  sqrt(1.000000) = 1.000000
  sqrt: Argument out of domain
Mit Hilfe von strerror läßt sich die obige Fehlerausgabe etwas weiter ausgestalten:
  printf("sqrt(%f): %s\n", x, strerror(errno));
anstelle von perror("sqrt") bewirkt folgende Ausgabe
  sqrt(1.000000) = 1.000000
  sqrt(-1.000000): Argument out of domain
Das Verhalten des Programms im Fehlerfall ist jedoch nicht systemunabhängig:
  cc unter Unix System V/68 auf Motorola
  sqrt(1.000000) = 1.000000
  sqrt: DOMAIN error
  sqrt(-1.000000): Argument out of domain

Zurück zum Menü
Zurück zur vorigen Seite Weiter zur nächsten Seite

P. Böhme, 19.12.1995