Allgemeine Regel: negative oder positive Werte für Fehlercode in C / C ++ [geschlossen]

8

Ich habe meinen eigenen Rückgabetyp und Funktionen wie folgt definiert:

%Vor%

Allerdings bin ich ein wenig unsicher bezüglich der Fehlerart Werte hier; Was ist Standard / Best Practice für Werte von Fehlerrückmeldungen in C / C ++ - negativ oder positiv ?

Aktualisierung: Danke für deine Antworten! Ich war auf der Suche nach Informationen über C und C ++, aber ich weiß auch, dass dies gute Fragen zur allgemeinen Struktur und den Methoden der einzelnen Sprachen aufwirft (Ausnahmen, Fehlercodes, Objektrückgaben usw.).

    
pbeck 04.10.2012, 13:16
quelle

5 Antworten

15

Das sind wirklich zwei völlig verschiedene Fragen (C- und C ++ - Versionen), die als eine getarnt sind.

In C ++ ist die Antwort einfach: Verwenden Sie Rückgabewerte für ... zurückgegebene Datenwerte und Ausnahmen für Fehler- / Ausnahmefälle. Verwenden Sie keine Rückgabewerte für die Fehlerprüfung in reinem C ++ (eine C-Bibliothek-API zu C ++ ist eine andere Geschichte).

In C haben Sie diese Option nicht, also würde ich vorschlagen, 0 für Erfolg und negative Zahlen für Fehlercodes zu verwenden. Dies lässt die Flexibilität, falls gewünscht, positive Zahlen für zusätzliche Erfolgsinformationen zu verwenden (zum Beispiel read Aufrufe)

    
Mark B 04.10.2012, 13:40
quelle
4

C ++:

  1. Es ist eine Frage der Wahl, ich habe beide gesehen.
  2. Benutze Ausnahmen!
Luchian Grigore 04.10.2012 13:17
quelle
2

Ich weiß nicht über C ...

... aber in C ++ ist die Idee, im Allgemeinen keine Fehlercodes zu verwenden.

Ich meine nicht, dass Sie Ausnahmen verwenden sollten, aber ein Fehlercode ist nicht wirklich zu informativ (fehlt Kontext, was ist der Wert von FILE_NOT_FOUND , wenn der Dateiname unbekannt ist?).

In den Fällen, in denen ich keine Ausnahmen verwendete, tendierte ich dazu, vollständig ausgeblendete Fehlerobjekte zu bevorzugen. Ein Beispiel könnte sein:

%Vor%

Hier erhalten Sie entweder eine Datei oder einen Fehler, je nachdem, was gerade passiert.

    
Matthieu M. 04.10.2012 13:21
quelle
2

Es gibt mehrere Konventionen zur Auswahl:

  • microsoft verwendet 0 = FALSE = Fehler für die meisten seiner High-Level-APIs. und lassen Sie den Benutzer den spezifischen Fehler mit einer globalen Funktion suchen GetLastError()
  • microsoft verwendet 0 = ok für untergeordnete Apis, wie Registrierung, Audio oder Telefonie. Diese alle geben einen ähnlichen Typ wie HRESULT zurück, der den spezifischen Fehlercode enthält.
  • Posix-Funktionen, die einen Status zurückgeben, geben normalerweise -1 für Fehler zurück und lassen den Benutzer den Fehler über eine globale Variable errno suchen.
  • Funktionen, die einen Zeiger zurückgeben, geben normalerweise NULL für den Fehler
  • zurück
  • c ++ STL-Funktionen geben 'end' für den Status 'nicht gefunden' zurück. Fehler wie "out-of-memory" werden mit einer Ausnahme gemeldet.

Im Allgemeinen ist es wichtiger, dass Sie Ihre Konvention konsistent verwenden, als die Konvention, die Sie verwenden.

Übrigens, einige Beispiele dafür, wie das nicht geht, finden Sie in den Header-Dateien von Microsoft:

%Vor%

Achten Sie auch auf zwei verschiedene Fehlerwerte für HANDLE in Windows: entweder 0 oder INVALID_HANDLE_VALUE

    
Willem Hengeveld 04.10.2012 13:30
quelle
1

Es ist besser, 0 (Null) und nicht Null zu verwenden, damit sie auch als boolesch angesehen werden können. Normalerweise ist false 0 und wahr ist alles andere.

    
Brady 04.10.2012 13:16
quelle

Tags und Links