Wie ordnen Sie Fehlercodes zu?

13

Wie identifizieren, erstellen und verwalten Sie bei der Entwicklung eines mittelgroßen Projekts Fehlercodes?

Ich kann mir für mein ganzes Leben keine einfache und saubere Methode dafür vorstellen. Einige meiner Ideen konvertieren Klassennamen und Methodennamen in eine Ganzzahlzeichenfolge, aber das ist viel zu lang, um dem Benutzer zusätzlich zu der Tatsache angezeigt zu werden, dass sich Methodennamen und Klassennamen möglicherweise ändern (hoffentlich nicht!). Andere verwenden lediglich ein inkrementierendes Protokollsystem (dh wenn ich eine neue Fehlermeldung erstelle, füge einfach 1 zur letzten Fehlernachrichten-ID hinzu). Aber das ist einfach völlig unorganisiert.

Um genauer zu sein, ich spreche über Fehlercode wie:

Error 401 Unauthorized.

ahodder
quelle
1
Fehlercodes? Wie "magische Zahlen"? Zum Beispiel ... FEHLER 001. Dann gehen Sie zu einer Liste und lesen FEHLER 001 bedeutet, dass bla bla bla ... Ja?
wleao
@wleao - Yessir. Ich werde meine Frage bearbeiten, um das zu erfassen. Vielen Dank.
Ahodder
Lies
Wie du in deiner Frage bearbeitet hast. Schauen Sie sich an, wie sie es mit http machen. Ich weiß nicht, ob es eine gute Idee ist, überhaupt magische Zahlen zu verwenden. Wenn Sie jedoch wirklich dazu bereit sind, befolgen Sie deren Konzepte. Zum Beispiel haben sie eine Taxonomie von Fehlern (haben Sie das?).
wleao
@wleao - noch nicht, aber dank dir und Péter Török werde ich definitiv einen erstellen. :)
Ahodder

Antworten:

16

Nein.

Fehlercodes sind ein Anachronismus. Sie stammen aus früheren Zeiten, als die Ausgabe sehr schwierig und kostspielig war, und die einzige Möglichkeit, einen Fehlerzustand zu signalisieren, war möglicherweise die Verwendung einer Reihe von Frontleuchten: pdp11 / 70 Frontplatte

Heutzutage haben wir eine ausgereifte Ausnahmebehandlung, die in so ziemlich jeder gängigen Sprache eingebaut ist. Benutze es. Geben Sie die Benutzerinformationen an, mit denen sie arbeiten können. belästige sie nicht mit technischem Blabla, sondern erzähle ihnen grob, was schief gelaufen ist und was sie dagegen tun können. Geben Sie für die Protokollierung einfach die beschreibenden Namen Ihrer Ausnahmen ein und protokollieren Sie den Namen. Einfacher zu merken und auch einfacher mit grep oder ähnlichen Suchwerkzeugen zu finden.

Die Ausnahme ist natürlich, wenn Sie für Situationen programmieren, in denen die Ausgabe noch schwierig und teuer ist, z. B. für eingebettete Systeme oder Netzwerkprotokolle. HTTP verwendet nach wie vor numerische Antwortcodes, da diese äußerst einfach und effizient zu analysieren sind. In einigen Situationen kann das Lesen der ersten Ziffer bereits ausreichend sein, und Sie können den Rest des Pakets verwerfen.

tdammers
quelle
Vielen Dank für die ausführliche Antwort, die viel Sinn macht und gut zu wissen ist.
Ahodder
Ihre Verwendung der Illustration passt perfekt zu Ihrem Argument. Ich habe schon immer von PDP-11 gelesen. Aber das ist tatsächlich das erste, das ich je gesehen habe. Vielen Dank.
Mike Owens
2
Innerhalb von Code würde ich lieber einen Fehlercode behandeln und ich bin nicht so alt.
JeffO
@ Jeff: Alles, was Sie mit Fehlercodes machen können, kann auch mit Ausnahmen gemacht werden, und dann noch ein bisschen mehr. Wenn Sie Fehlercodes mit Ausnahmen imitieren möchten, müssen Sie nur werfen, anstatt den Fehlercode zurückzugeben, und den Rückgabewert mit E_OK (oder was auch immer die OK-Antwort ist) abfangen, anstatt ihn zu vergleichen. Um fair zu sein, C hat keine wirklichen Ausnahmen und Longjumps sind nicht so bequem. Wenn Sie also C machen, sind Sie etwas entschuldigt.
tdammers
@ Mike: Das Bild stammt aus dem Wikipedia-Artikel über die PDP-11-Serie. wenn das nicht leicht zu finden ist, weiß ich nicht was ist.
tdammers
6

Sie sollten überprüfen, wie Fehler- / Statuscodes in allgemeinen Protokollen wie HTTP organisiert sind . Sie reservieren unterschiedliche Bereiche für verschiedene Arten von Zuständen / Fehlern. Dies erleichtert es den Benutzern, einen unbekannten Statuscode zu identifizieren, und den Entwicklern, einen Code für eine neue Art von Fehler zuzuweisen, der zuvor nicht behandelt wurde.

Péter Török
quelle
Fügen Sie Ihrer Antwort die Taxonomiesache hinzu. Dies erleichtert die Verwaltung und Wartung der Fehler.
wleao
3

Sorry, warum überhaupt Fehlercodes verwenden?
Fangen Sie die Ausnahme ab, protokollieren Sie sie und bieten Sie an, einen Bericht zu senden, wenn sich das Programm nicht wiederherstellen lässt .

(Angenommen, Ihre Sprache unterstützt Ausnahmen.)

Die einzige relevante Information, die Ihnen helfen könnte, den Fehler zu beheben, ist der Stack-Trace, den Sie nicht mit einem Fehlercode erhalten. (Ich gehe auch davon aus, dass Sie Fehlercodes für Fehlerberichte verwenden und sie nicht in das Gesicht eines Benutzers werfen möchten.)

Dan
quelle
Das ist sehr richtig und ich mache das, aber was würde ich den Benutzern sagen? Ich bin sicher, sie wären wütend, wenn sie mitmachen würden und die Anwendung einfach stirbt, keine Erklärung oder irgendetwas, woran sie sich ärgern könnten.
Ahodder
6
Ich denke, es gibt mindestens drei verschiedene Dinge, die hier verwirrt werden. Das erste sind Codes, die wie bei HTTP von Software zu Software verwendet werden. Die zweite sind Codes, die Benutzer in einem Fehlerbericht verwenden können (z. B. Vorfallsnummern). Die letzten Meldungen können dem Benutzer angezeigt werden. Es kann hilfreich sein, sie als separate Dinge zu betrachten.
Darien
2
Ein wichtiger Grund für die Verwendung von Fehlercodes ist das Erstellen einer Back-End-Anwendung. Es ist für ein Client-Programm viel einfacher und eleganter, einen Code zu interpretieren und darauf zu reagieren, als auf eine Fehlermeldung oder einen Stack-Trace. Nicht alle Fehler stammen von Fehlern.
Kaypro II
1
Ausnahmen sind sehr schwer zu korrigieren! Siehe Links in: programmers.stackexchange.com/questions/97874/…
Coder
@Coder: Ihr Beispiel missbraucht Ausnahmen. Sie sollten fangen, was Sie erwarten, geworfen zu werden . Die meisten Methoden müssen nicht einmal damit rechnen, dass eine einzige Ausnahme ausgelöst wird. Es liegt in der Verantwortung des Programmierers, zu entscheiden, was zu handhaben ist, und ich stimme zu , dass es schwierig sein kann, es richtig zu machen .
Dan
2

Ich gehe von einem prozeduralen Kontext aus (C). Wenn Sie Objekte haben, ist ein Fehlerobjekt normalerweise besser, unabhängig davon, ob es sich um eine Ausnahme handelt oder nicht.

Sie sollten lokale Fehlercodes für jedes Modul verwenden. Für eine Bibliothek können Sie eine spezielle Kopfzeile mit den Fehlercodes 1, 2 usw. (oder -1, -2, wenn Sie dies vorziehen) haben. Stellen Sie sicher, dass Sie immer einen dieser Codes zurückgeben, z. B. errnoin Ihre eigenen Codes übersetzen. Wenn Sie mehrere Modulebenen haben, übersetzen Sie bei jedem Schritt (oder definieren Sie einen Bereich für den tieferen Fehler, z. B. die Werte 1001 - 1050 stammen von diesem anderen Modul).

Es ist auch wichtig, dass Sie ein Mittel zum Übersetzen des Codes in eine Zeichenfolge bereitstellen. Sie sollten niemals nur den Code melden, der nur zu Frust führt. Eigentlich sollte so ziemlich jeder Code in Ihrer Anwendung mit einer String-Übersetzungsfunktion ausgestattet sein. Zum Beispiel hat libc in der Regel strerrorund strsignal, aber leider fehlt strwaitstatus.

Per Johansson
quelle
fantastisches Detail, danke. Das ist eigentlich sehr hilfreich.
Ahodder