Frage

Wenn in einer klassischen Linux C/C ++ -Software etwas schief geht, haben wir die magische Variable, die uns einen Hinweis darauf gibt, was gerade schief gelaufen ist.

Aber wo sind diese Fehler definiert?

Nehmen wir ein Beispiel (es ist tatsächlich ein Stück einer QT -App, daher der QDebug ()).

if (ioctl(file, I2C_SLAVE, address) < 0) {
    int err = errno;
    qDebug() << __FILE__ << __FUNCTION__ << __LINE__ 
        << "Can't set address:" << address
        << "Errno:" << err << strerror(err);
     ....

Der nächste Schritt besteht darin, sich zu untersuchen, was dieses Errno war, damit wir entscheiden können, ob wir nur kündigen oder versuchen, etwas gegen das Problem zu unternehmen.

Also fügen wir an diesem Punkt vielleicht ein If oder Wechseln hinzu.

if (err == 9)
{
    // do something...
}
else 
{
    //do someting else
}

Und meine Frage ist, wo die Fehler, die "9" repräsentiert, zu finden? Ich mag diese Art von magischen Zahlen in meinem Code nicht.

/Vielen Dank

War es hilfreich?

Lösung

Sie sind im Allgemeinen in definiert in /usr/include/errno.h* und sind zugänglich, indem er errno.h einbezieht:

#include <errno.h>

Ich schreibe sowohl den Errno -Wert als auch seine Textbedeutung bei der Meldung eines Fehlers und erhalte die textuelle Bedeutung über strerror():

if (something_went_wrong)
{
    log("Something went wrong: %s (%d)", strerror(errno), errno);
    return false;
}

Aus einer Linux -Shell können Sie jedoch die verwenden perror Nützlichkeit, um herauszufinden, was unterschiedliche Errno -Werte bedeuten:

$ perror 9
OS error code   9:  Bad file descriptor

Bearbeiten: Ihr Code sollte geändert werden, um den symbolischen Wert zu verwenden:

if (err == EBADF)
{
    // do something...
}
else 
{
    //do someting else
}

Bearbeiten 2: * Unter Linux werden zumindest die tatsächlichen Werte in definiert in /usr/include/asm-generic/{errno,errno-base}.h und andere Orte, um es zu einem Schmerz zu machen, sie zu finden, wenn Sie sie ansehen möchten.

Andere Tipps

NAME
       errno - number of last error

SYNOPSIS
       #include <errno.h>

DESCRIPTION
       The  <errno.h>  header file defines the integer variable errno, which is set by system calls and some library functions in the event of an error to indicate
       what went wrong.  Its value is significant only when the return value of the call indicated an error (i.e., -1 from most system calls; -1 or NULL from  most
       library functions); a function that succeeds is allowed to change errno.

       Valid error numbers are all non-zero; errno is never set to zero by any system call or library function.

Normalerweise müssen Sie zur Implementierung der Fehlerbehandlung wissen, welche bestimmten Fehlercodes von der Funktion zurückgegeben werden können. Diese Informationen sind in Man oder at erhältlich http://www.kernel.org/doc/man-pages/.

Zum Beispiel für IOCTL -Anruf sollten Sie die folgenden Codes erwarten:

   EBADF  d is not a valid descriptor.

   EFAULT argp references an inaccessible memory area.

   EINVAL Request or argp is not valid.

   ENOTTY d is not associated with a character special device.

   ENOTTY The specified request does not apply to the kind of object that the
          descriptor d references.

Bearbeiten: if <errno.h> Ist auch alle Dateien enthalten, die alle möglichen Fehlercodes definieren, sodass Sie ihren genauen Standort nicht wirklich kennen müssen.

Die Datei lautet:

/usr/include/errno.h

--p

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top