Nachdem ich mit Ausnahmen in Java und .NET gearbeitet und viele Artikel gelesen hatte, in denen es darum ging, wie / wann / warum Ausnahmen abgefangen werden sollen, stellte ich mir schließlich die folgenden Schritte vor, die ich in meinem Kopf durcharbeite, wenn eine potenzielle Ausnahme auftritt oder eine Ausnahme muss ich fangen (Java) ... auch wenn es nie passiert (seufz ...). Und es scheint zumindest für mich zu funktionieren:
- Gibt es irgendetwas Nützliches, das ich mit dieser Ausnahme machen kann (außer Protokollierung)? Wenn die Antwort Ja lautet, schreiben Sie den Umgehungscode, und wenn die Umgehung Ausnahmen auslösen kann, fahren Sie mit Schritt 2 fort:
- Wickeln Sie die Ausnahme um eine Laufzeitausnahme, werfen Sie sie aus und fahren Sie mit Schritt 3 fort.
- Fangen Sie in der übergeordneten Klasse, in der eine mögliche Datenbank- / Prozesstransaktion initiiert wurde, die Ausnahme ab, setzen Sie die Transaktion zurück und lösen Sie die Ausnahme erneut aus.
- Protokollieren Sie in der höchsten Klasse (die möglicherweise die Klasse ist, in der die Transaktion initiiert wurde) die Ausnahme mit einem Protokollierungsframework wie slf4j ( z. B. gekoppelt mit log4j ) oder log4net . Senden Sie die Ausnahme nach Möglichkeit direkt per E-Mail an eine Verteilerliste, die sich aus Entwicklern der Anwendung zusammensetzt.
- Wenn eine GUI vorhanden ist, zeigen Sie eine Fehlermeldung an, die auf benutzerfreundliche Weise angibt, was das Problem verursacht hat. Zeigen Sie die Exception / Stacktrace nicht an, es ist dem Benutzer egal und er muss nicht wissen, dass es sich um eine NullPointerException handelt.
Ich sollte auch den Schritt 0 hinzufügen , in dem ich absichtlich eine so genannte "Business" -Ausnahme (eine neue Ausnahme, die ich durch Erweitern der Klasse "Exception" erstelle) auslöse, wenn eine komplexe Behandlung aufgrund von Datenfehlern nicht ausgeführt werden kann, ABER das Es ist bekannt, dass dies passiert, da sie während der Analyse als Ausnahmefälle identifiziert wurden.
Mit Ausnahme des Protokollierungsteils stimme ich den von "mikera" geschriebenen Punkten voll und ganz zu. Ich möchte nur hinzufügen, dass die Ausnahme nur einmal protokolliert werden sollte .
Die Schritte , die ich aufgelistet habe, können sich auch unterscheiden, wenn Sie eine API / ein Framework schreiben . Dort ist das Auslösen gut gestalteter Ausnahmen obligatorisch, um Entwicklern das Verständnis ihrer Fehler zu erleichtern.
Zum Testen der Ausnahmen sollten Sie mit Scheinobjekten in der Lage sein, fast alles zu testen, unabhängig davon, ob es sich um Ausnahmen handelt oder nicht, vorausgesetzt, Ihre Klassen respektieren die Best Practice "Eine Klasse, um eine Sache zu tun". Ich persönlich stelle auch sicher, dass die wichtigsten, aber verborgenen Methoden als "geschützt" anstatt als "privat" gekennzeichnet werden, damit ich sie ohne großen Aufwand testen kann. Abgesehen davon ist das Testen von Ausnahmen einfach. Sie müssen nur die Ausnahme provozieren und das Auftreten einer Ausnahme "erwarten", indem Sie sie abfangen. Wenn Sie keine Ausnahme erhalten, liegt ein Unit-Testfallfehler vor.