Wann soll mit dem Schreiben von Ausnahmebehandlung, Protokollierung begonnen werden?

13

Wann beginnen Sie mit dem Schreiben Ihres Ausnahmebehandlungscodes? Wann beginnen Sie mit dem Schreiben von Protokollanweisungen?

Um diese Frage zu erörtern, nehmen wir an, dass wir uns auf einer .NET-Plattform mit log4net-Protokollierung befinden, die wir jedoch generisch beantworten können.

Lösung: Ein Windows Forms-Projekt. Projekte: Benutzeroberfläche, Geschäftsregeln, DataHandler

Schreiben Sie also zunächst Ihre DataHandler, die Ihre Datenmanipulationen wie Erstellen, Lesen, Aktualisieren und Löschen ausführen.

Folgen Sie dann Ihren Geschäftsregeln

Und dann Ihre Benutzeroberfläche oder eine andere Permutation der oben genannten.

Testen Sie Ihre Anwendung auf Funktionalität.

Und dann schreiben Sie Ihren Ausnahmebehandlungscode und schließlich Ihren Protokollierungscode?

Wann ist der richtige Zeitpunkt, um mit dem Schreiben Ihres Ausnahmebehandlungscodes zu beginnen?

PS: In dem Buch Clean Code heißt es: Schreibe zuerst deinen Try-Catch-finally- Block. Das veranlasste mich, diese Frage zu stellen.

Kanini
quelle

Antworten:

15

Sie schreiben Ihren Ausnahmebehandlungscode, wenn Sie das Ding schreiben, das etwas aufruft, das möglicherweise Ausnahmen verursacht.

Wenn Sie beispielsweise etwas schreiben, das Daten an ein Netzwerk sendet, sollten Sie auch den Code schreiben, der Verbindungs-Timeouts behandelt. Die Ausnahme ist direkt relevant für das, was Sie tun, und die Arbeit ist frisch in Ihrem Kopf.

Wenn Sie andererseits einen Parser schreiben, der Ausnahmen auslöst, wenn er auf eine fehlerhafte Protokolldateneinheit stößt, können Sie keinen Code zur Ausnahmebehandlung für die vom Parser erzeugten Ausnahmen schreiben . (Aber natürlich schreiben Sie Tests, um zu zeigen, wie und wann und warum der Parser Ausnahmen auslöst!)

Der Grund für den Vorschlag, zuerst Ihren try-catch-finally- Befehl zu schreiben, ist zweierlei: Schließlich dient er zum Bereinigen der Ressourcen, die die Funktion erstellt / verbraucht, und das Schreiben des catch-Befehls ist eine nette Erinnerung daran, dass die von Ihnen aufgerufenen Funktionen möglicherweise fehlschlagen. und Sie müssen (falls erforderlich) diese Fehler behandeln.

Ich neige dazu, Protokollierung nach der Tatsache hinzuzufügen. Ich bin mir nicht sicher, ob das klug ist, aber es ist genau das, was für mich funktioniert hat. Wenn ich anfange, Abnahmetests und dergleichen durchzuführen und Probleme zu lösen, füge ich die Protokollierung hinzu, damit ich Fehler nachverfolgen kann. (Und dann verlasse ich die Anmeldung.)

Frank Shearar
quelle
+1 aus Gründen, die hinter dem Schreiben von try-catch-finally first
stecken
1
In C ++ gibt es keinen endgültigen , und das aus sehr guten Gründen. RAII ist viel besser.
David Thornley
3

Wenn Sie von Anfang an keinen Code mit der entsprechenden Fehlerbehandlung und -protokollierung schreiben, wird dies meiner Erfahrung nach aufgrund von Zeitdruck nicht ausgeführt. Die erfolgreichsten Entwicklungsanstrengungen, die ich unternommen habe, waren die Ermittlung der grundlegenden Anwendungsstruktur, einschließlich des Codierungsstandards, der Art und Weise, wie Fehler behandelt werden, der Protokollierung, der grundlegenden Architektur und der Testtools.

Andernfalls werden Sie feststellen, dass Sie Aufgaben für Version 2.0 haben, z. B. "Fehlerbehandlung verbessern" und "Protokollierungssystem erstellen". Diese werden zugunsten neuer Funktionen gekürzt, und weil Sie "zu viel zu tun" haben, werden all diese Fehler in den Fehlerfällen behoben, über die Sie nicht nachgedacht haben. (Was ewig dauert, weil Sie kein Protokollierungssystem haben.

Gort den Roboter
quelle
1

Kommt darauf an, was du tust

für ausnahmen:

Wenn Sie etwas schreiben, das wahrscheinlich fehlerhaft ist, oder wenn es gute Top-Level-Punkte gibt, die Ausnahmen aufblähen lassen, um sie zu schreiben, während Sie fortfahren.

Wenn Sie etwas schreiben, das Leistung benötigt und eine geringe Fehlerwahrscheinlichkeit aufweist, fehlt ein sinnvoller Platz, um Fehlerbehandlungsroutinen zu platzieren, schreiben Sie die Fehlerbehandlungsroutinen, wo das Testen nachweist, dass Sie sie benötigen.

Wenn Sie in beiden Fällen nichts Nützliches mit dem Fehler zu tun haben, ziehen Sie in Betracht, ihn in die Luft sprudeln zu lassen (kein Handler).

zur Protokollierung:

Wenn Sie einen Audit-Trail benötigen, sollten Sie zuerst die Protokollierung schreiben. Wenn Sie Fehler ganz nach oben sprudeln lassen, müssen Sie auch dort eine Protokollierung durchführen, damit das Protokoll erfasst werden kann.

Abgesehen von diesen Fällen füge ich die Protokollierung im Allgemeinen nur an den Stellen hinzu, an denen das Testen / Verwenden dies als notwendig erweist, und ich wähle normalerweise die Option, sie zu deaktivieren, sobald ich damit fertig bin.

Rechnung
quelle
Danke für die ausführliche Antwort. Warum sollten Sie in Bezug auf die Protokollierung zuerst mit der Protokollierung beginnen, wenn ich einen Audit-Trail benötige? Warum kann ich sie nicht schreiben, nachdem ich mit dem Funktionalitätsaspekt fertig bin? Irgendwelche spezifischen Gründe?
Kanini
Für mich ist es einfacher, die Protokollierung zu schreiben, während Sie die zu prüfenden Funktionen schreiben. Dazu benötige ich die grundlegenden Protokollierungsfunktionen, bevor ich irgendetwas schreibe, das dazu führen würde, dass ich sie benötige. Wenn ich das Audit nicht schreibe, könnte ich mir Sorgen machen, dass mir etwas entgeht.
Bill
1

Sie können die Überwachung und die Ausnahmebehandlung als Services implementieren. Für die Audit-Protokollierung auf Anwendungsebene sind Statusdaten zu jedem Geschäftsvorgang erforderlich. Die Möglichkeit, eine Anwendung in einem Geschäfts- oder Transaktionskontext zu überwachen, erfordert eine Überwachungsschnittstelle innerhalb des Dienstes, um Nachrichten zu senden, die den für den Dienstaufruf spezifischen Transaktionsstatus angeben. Dazu muss jeder Service bei kritischen Schritten im Geschäftsvorgang eine Statusmeldung senden. Sie können dann einen Echtzeit-Viewer erstellen, um Statusnachrichten (basierend auf der Semantik der Nachricht - z. B. Transaktions-ID) mit den Diensten in der Verbundanwendung zu korrelieren. Dies bietet eine End-to-End-Ansicht des Geschäftsvorgangs für das SLA-Management, die Fehlersuche und die Problembestimmung.

Ein Überwachungsdienst kann dann als Zustandsmaschine implementiert werden, die Nachrichten basierend auf in ihrer Konfiguration definierten Kriterien verarbeiten und aufzeichnen kann. Ein generischer Ausnahmebehandler kann den Überwachungsservice auch verwenden, um eine zentralisierte Ansicht von Problemen zu unterstützen, die in der Unternehmens-SOA auftreten, um die ausnahmebasierte Überwachung zu unterstützen. Jede nicht auftretende Bedingung in der Lösung wird instrumentiert, um eine Ausnahmemeldung an den Ausnahmehandler zu senden .

Eric Roch
quelle
1

Schreiben Sie es, wenn Sie es brauchen, aber gestalten Sie es von Anfang an so, dass es darin enthalten ist.

Mit anderen Worten: Stellen Sie sicher, dass es eine Möglichkeit gibt, mit dieser Protokollierungsfunktion umzugehen, und fügen Sie die eigentliche Schrauben- und Mutternfunktion (welche Meldungen protokolliert werden) später hinzu, wenn dies erforderlich ist. Fügen Sie in Ausnahmefällen den Haken hinzu (und schließlich, wenn Sie den haben), bevor Sie den Wurf schreiben. Das hilft, nicht zu vergessen und sich eine Wiederholung oder schlimmstenfalls einen Fehler / Absturz zu ersparen.

anon
quelle