GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Benutzerdefinierte Fehlerbereichswerte (POSIX- oder Linux-spezifisch)

Das eigentliche errno -Werte werden nicht durch die C- und C++-Standards definiert. Es gibt also keine Möglichkeit, eine bestimmte (positive) Ganzzahl zurückzugeben und zu garantieren, dass sie nicht mit derjenigen kollidiert, die eine Implementierung verwendet. Der C-Standard erfordert nur drei Marco:

C11 Entwurf, 7.5 Fehler

Die Makros sind

EDOM
EILSEQ
ERANGE

die sich zu ganzzahligen konstanten Ausdrücken vom Typ int erweitern lassen, deutlich positive Werte aufweisen und für die Verwendung in #if-Vorverarbeitungsanweisungen geeignet sind;

Sie wissen also nicht, welche anderen errno Werte werden in Ihrer Implementierung definiert.

Die errno Werte sind positive Ganzzahlen in Standard-C und POSIX. Sie könnten also Ihre eigene Aufzählung mit negativen Werten verwenden, um Ihre eigenen Fehlernummern zu definieren. Aber dann können Sie die strerror/perror-Schnittstellen nicht verwenden. Daher benötigen Sie möglicherweise einen zusätzlichen Wrapper für strerror/perror, um Ihre eigenen Fehlernummern zu interpretieren.

Etwas wie:

enum myErrors{
ERR1 = -1,
ERR2 = -2,
...
ERR64 = -64
};

char *my_strerror(int e)
{
   if (e>=ERR1 && e<=ERR2)
      return decode_myerror(e); // decode_myerror can have a map for  
                                //your error numbers and return string representing 'e'.
   else
      return strerror(e);
}

und ein ähnliches für perror .

Beachten Sie, dass Sie auch errno festlegen sollten bis 0 bevor Sie Ihre "Open-Ressource" aufrufen, um sicherzustellen, dass errno wurde tatsächlich von Ihrer Funktion gesetzt.

In solchen Situationen würde ich die Standard-Errno ganz vermeiden und meine eigene Enumeration für Fehler definieren. Sie könnten das tun, wenn Ihre "Open-Ressource" nicht zu kompliziert ist und zu viele mögliche Fehlercodes zurückgibt.


Linux
  1. Posix Find auf bestimmte Tiefe beschränken?

  2. Was genau ist Posix?

  3. Prüfen, ob $reply in einem Zahlenbereich liegt?

  4. Befehl auf einem definierten Bereich von Verzeichnissen ausführen?

  5. Doppelte Werte in einem Feld entfernen?

Bash-Sequenzausdruck (Bereich)

Beschränken Sie Gnu-make auf Posix-Make-Verhalten?

Ist errno Thread-sicher?

Was bedeutet POSIX?

Suche nach eindeutigen Werten in einer Datendatei

Verbindung zu MongoDB Fehler Nr. 111 abgelehnt