Wenn eine Sprache von Natur aus Ausnahmen unterstützt, wird es bevorzugt, Ausnahmen auszulösen, und die Clients können die Ausnahme abfangen, wenn sie nicht möchten, dass dies zu einem Fehler führt. Tatsächlich erwarten die Clients Ihres Codes Ausnahmen und es treten viele Fehler auf, da sie die Rückgabewerte nicht überprüfen.
Die Verwendung von Ausnahmen bietet eine Reihe von Vorteilen, wenn Sie die Wahl haben.
Mitteilungen
Ausnahmen enthalten vom Benutzer lesbare Fehlermeldungen, die von den Entwicklern zum Debuggen verwendet oder den Benutzern auf Wunsch sogar angezeigt werden können. Wenn der konsumierende Code die Ausnahme nicht verarbeiten kann, kann er sie immer protokollieren, sodass die Entwickler die Protokolle durchgehen können, ohne bei jeder anderen Ablaufverfolgung anhalten zu müssen, um den Rückgabewert zu ermitteln und ihn in einer Tabelle zuzuordnen, um herauszufinden, um was es sich handelt tatsächliche Ausnahme.
Bei Rückgabewerten können auf einfache Weise keine zusätzlichen Informationen bereitgestellt werden. Einige Sprachen unterstützen das Tätigen von Methodenaufrufen, um die letzte Fehlermeldung zu erhalten, daher wird diese Sorge ein wenig gemildert. Dies erfordert jedoch, dass der Aufrufer zusätzliche Aufrufe durchführt, und manchmal den Zugriff auf ein "spezielles Objekt", das diese Informationen enthält.
Im Falle von Ausnahmemeldungen gebe ich so viel Kontext wie möglich an, wie zum Beispiel:
Für den Benutzer "bar", auf den im Benutzerprofil verwiesen wurde, konnte keine Richtlinie mit dem Namen "foo" abgerufen werden.
Vergleichen Sie dies mit einem Rückkehrcode -85. Welches würdest du bevorzugen?
Stapel aufrufen
Ausnahmen haben in der Regel auch detaillierte Aufruflisten, mit deren Hilfe Code schneller und schneller debuggt werden kann. Auf Wunsch können sie auch vom aufrufenden Code protokolliert werden. Dies ermöglicht es den Entwicklern, das Problem in der Regel auf die genaue Linie genau zu lokalisieren, und ist daher sehr leistungsfähig. Vergleichen Sie dies erneut mit einer Protokolldatei mit Rückgabewerten (z. B. -85, 101, 0 usw.). Welchen bevorzugen Sie?
Scheitern Sie schnell voreingenommen Ansatz
Wenn eine Methode an einer fehlgeschlagenen Stelle aufgerufen wird, wird eine Ausnahme ausgelöst. Der aufrufende Code muss die Ausnahme entweder explizit unterdrücken, oder sie schlägt fehl. Ich fand das wirklich erstaunlich, weil der Code während der Entwicklung und des Testens (und sogar in der Produktion) schnell ausfällt und die Entwickler gezwungen sind, ihn zu reparieren. Wenn bei Rückgabewerten die Überprüfung auf einen Rückgabewert fehlschlägt, wird der Fehler unbemerkt ignoriert und der Fehler tritt an einer unerwarteten Stelle auf, was in der Regel einen viel höheren Aufwand beim Debuggen und Beheben verursacht.
Ein- und Auspacken von Ausnahmen
Ausnahmen können in andere Ausnahmen eingeschlossen und bei Bedarf wieder entfernt werden. Beispielsweise kann Ihr Code ArgumentNullException
den aufrufenden Code in einen Zeilenumbruch setzen, UnableToRetrievePolicyException
da dieser Vorgang im aufrufenden Code fehlgeschlagen ist. Während dem Benutzer möglicherweise eine Meldung angezeigt wird, die dem oben angegebenen Beispiel ähnelt, wird die Ausnahme möglicherweise durch einen Diagnosecode entpackt, der feststellt, ArgumentNullException
dass das Problem durch einen verursacht wurde. Dies bedeutet, dass es sich um einen Codierungsfehler im Code Ihres Verbrauchers handelt. Dies könnte dann eine Warnung auslösen, damit der Entwickler den Code korrigieren kann. Solche erweiterten Szenarien sind mit den Rückgabewerten nicht einfach zu implementieren.
Einfachheit des Codes
Dieser ist etwas schwieriger zu erklären, aber ich habe durch diese Codierung sowohl mit Rückgabewerten als auch mit Ausnahmen gelernt. Der Code, der unter Verwendung von Rückgabewerten geschrieben wurde, rief normalerweise auf und überprüfte dann in einer Reihe von Schritten, wie hoch der Rückgabewert war. In einigen Fällen wird eine andere Methode aufgerufen und es werden nun weitere Überprüfungen auf die Rückgabewerte dieser Methode durchgeführt. Mit Ausnahmen ist die Ausnahmebehandlung in den meisten, wenn nicht allen Fällen viel einfacher. Sie haben einen try / catch / finally-Block, wobei die Laufzeitumgebung versucht, den Code in den finally-Blöcken zur Bereinigung auszuführen. Sogar verschachtelte try / catch / finally-Blöcke sind relativ einfacher zu verfolgen und zu verwalten als verschachtelte if / else-Blöcke und zugehörige Rückgabewerte aus mehreren Methoden.
Fazit
Wenn die von Ihnen verwendete Plattform Ausnahmen unterstützt (z. B. Java oder .NET), sollten Sie auf jeden Fall davon ausgehen, dass es keine andere Möglichkeit gibt, Ausnahmen auszulösen, da diese Plattformen Richtlinien zum Auslösen von Ausnahmen enthalten und Ihre Clients dies erwarten damit. Wenn ich Ihre Bibliothek verwenden würde, würde ich nicht die Mühe machen, die Rückgabewerte zu überprüfen, da ich davon ausgehe, dass Ausnahmen ausgelöst werden. So ist die Welt auf diesen Plattformen.
Wenn es jedoch C ++ wäre, wäre es etwas schwieriger zu bestimmen, da bereits eine große Codebasis mit Rückgabecodes vorhanden ist und eine große Anzahl von Entwicklern so eingestellt ist, dass sie Werte im Gegensatz zu Ausnahmen zurückgeben (z. B. Windows ist voll mit HRESULTs). . Darüber hinaus kann es in vielen Anwendungen auch zu Leistungsproblemen kommen (oder zumindest als solche wahrgenommen werden).
try
/catch
existiert. Darüber hinaus können Sie Ihrentry
/catch
viel weiter oben im Stapel an einem geeigneten Ort ablegen, um ihn zu handhaben (was eine stärkere Trennung von Bedenken ermöglicht).