Meiner Meinung nach sind Ausnahmen ein wesentliches Instrument zur Erkennung von Codefehlern zur Laufzeit. Sowohl im Test als auch in der Produktion. Machen Sie ihre Nachrichten so ausführlich, dass Sie in Kombination mit einem Stack-Trace anhand eines Protokolls herausfinden können, was passiert ist.
Ausnahmen sind meist ein Entwicklungswerkzeug und eine Möglichkeit, in unerwarteten Fällen sinnvolle Fehlerberichte aus der Produktion zu erhalten.
Abgesehen von der Trennung von Bedenken (glücklicher Pfad mit nur erwarteten Fehlern vs. Durchfallen bis zum Erreichen eines generischen Handlers für unerwartete Fehler) ist es eine gute Sache, Ihren Code lesbarer und wartbarer zu machen, und es ist in der Tat unmöglich, Ihren Code für alles Mögliche vorzubereiten unerwartete Fälle, selbst wenn sie mit Fehlerbehandlungscode aufgebläht werden, um die Unlesbarkeit zu beenden.
Das ist eigentlich die Bedeutung von "unerwartet".
Übrigens, was erwartet wird und was nicht, ist eine Entscheidung, die nur am Einsatzort getroffen werden kann. Aus diesem Grund haben die überprüften Ausnahmen in Java nicht funktioniert - die Entscheidung wird zum Zeitpunkt der Entwicklung einer API getroffen, wenn überhaupt nicht klar ist, was erwartet oder unerwartet ist.
Einfaches Beispiel: Die API einer Hash-Map kann zwei Methoden haben:
Value get(Key)
und
Option<Value> getOption(key)
Die erste löst eine Ausnahme aus, wenn sie nicht gefunden wird. Die letztere gibt Ihnen einen optionalen Wert. In einigen Fällen ist letzteres sinnvoller, aber in anderen Fällen muss Ihr Code einfach davon ausgehen, dass ein Wert für einen bestimmten Schlüssel vorhanden ist. Wenn es also keinen gibt, ist dies ein Fehler, den dieser Code aufgrund eines grundlegenden Problems nicht beheben kann Annahme ist gescheitert. In diesem Fall ist es eigentlich das gewünschte Verhalten, aus dem Codepfad herauszufallen und auf einen generischen Handler zurückzugreifen, falls der Aufruf fehlschlägt.
Code sollte niemals versuchen, mit fehlgeschlagenen Grundannahmen umzugehen.
Natürlich nur, indem Sie sie überprüfen und gut lesbare Ausnahmen auslösen.
Ausnahmen zu werfen ist nicht böse, aber sie zu fangen kann es sein. Versuchen Sie nicht, unerwartete Fehler zu beheben. Fangen Sie Ausnahmen an einigen Stellen ab, an denen Sie eine Schleife oder Operation fortsetzen möchten, protokollieren Sie sie, melden Sie möglicherweise einen unbekannten Fehler, und fertig.
Fangblöcke überall sind eine sehr schlechte Idee.
Entwerfen Sie Ihre APIs auf eine Weise, die es Ihnen leicht macht, Ihre Absicht auszudrücken, dh zu erklären, ob Sie einen bestimmten Fall erwarten, z. B. Schlüssel nicht gefunden oder nicht. Benutzer Ihrer API können dann den auslösenden Aufruf nur für wirklich unerwartete Fälle auswählen.
Ich denke, der Grund, warum die Leute Ausnahmen ablehnen und zu weit gehen, indem sie dieses entscheidende Werkzeug für die Automatisierung der Fehlerbehandlung und die bessere Trennung von Bedenken von neuen Sprachen weglassen, sind schlechte Erfahrungen.
Das und einige Missverständnisse darüber, wozu sie eigentlich gut sind.
Wenn Sie sie durch ALLES durch monadische Bindung simulieren, ist Ihr Code weniger lesbar und kann nicht mehr gewartet werden, und Sie haben keine Stack-Ablaufverfolgung, was diesen Ansatz erheblich verschlechtert.
Die Fehlerbehandlung im funktionalen Stil eignet sich hervorragend für erwartete Fehlerfälle.
Lassen Sie die Ausnahmebehandlung automatisch den Rest erledigen, das ist es, wofür es ist :)
panic
was nicht ganz dasselbe ist. Zusätzlich zu dem, was dort gesagt wird, ist eine Ausnahme nicht viel mehr als eine raffinierte (aber bequeme) Art, eine auszuführenGOTO
, obwohl es aus offensichtlichen Gründen niemand so nennt.