Es sind viele Anforderungen erforderlich, damit ein System Ausnahmen ordnungsgemäß übermittelt und behandelt. Es gibt auch viele Optionen für eine Sprache zur Auswahl, um das Konzept umzusetzen.
Voraussetzungen für Ausnahmen (in keiner bestimmten Reihenfolge):
Dokumentation : Eine Sprache sollte ein Mittel haben, um Ausnahmen zu dokumentieren, die eine API auslösen kann. Idealerweise sollte dieses Dokumentationsmedium maschinenverwendbar sein, damit Compiler und IDEs den Programmierer unterstützen können.
Außergewöhnliche Situationen übertragen : Dies ist offensichtlich, damit eine Funktion Situationen übermitteln kann, die verhindern, dass die aufgerufene Funktionalität die erwartete Aktion ausführt. Meiner Meinung nach gibt es drei große Kategorien solcher Situationen:
2.1 Fehler im Code, die dazu führen, dass einige Daten ungültig sind.
2.2 Probleme bei der Konfiguration oder anderen externen Ressourcen.
2.3 Ressourcen, die von Natur aus unzuverlässig sind (Netzwerk, Dateisysteme, Datenbanken, Endbenutzer usw.). Dies ist ein Eckpfeiler, da wir aufgrund ihrer Unzuverlässigkeit mit ihren sporadischen Fehlern rechnen müssen. In diesem Fall sind diese Situationen als außergewöhnlich anzusehen?
Stellen Sie genügend Informationen bereit, damit der Code damit umgehen kann : Die Ausnahmen sollten dem Angerufenen ausreichende Informationen zur Verfügung stellen, damit er reagieren und möglicherweise mit der Situation umgehen kann. Die Informationen sollten auch ausreichend sein, damit diese Ausnahmen bei der Protokollierung einem Programmierer genügend Kontext bieten, um die fehlerhaften Anweisungen zu identifizieren, zu isolieren und eine Lösung bereitzustellen.
Geben Sie dem Programmierer Vertrauen in den aktuellen Status des Ausführungsstatus seines Codes : Die Ausnahmebehandlungsfunktionen eines Softwaresystems sollten ausreichend vorhanden sein, um die erforderlichen Sicherheitsvorkehrungen zu treffen und dem Programmierer aus dem Weg zu gehen, damit er sich auf die Aufgabe konzentrieren kann Hand.
Um diese abzudecken, wurden die folgenden Methoden in verschiedenen Sprachen implementiert:
Überprüfte Ausnahmen Bieten eine hervorragende Möglichkeit, Ausnahmen zu dokumentieren, und sollten bei korrekter Implementierung theoretisch ausreichend Sicherheit bieten, dass alles in Ordnung ist. Die Kosten sind jedoch so hoch, dass viele es für produktiver halten, Ausnahmen einfach zu umgehen, indem sie sie verschlucken oder als ungeprüfte Ausnahmen erneut auslösen. Wenn unangemessen geprüfte Ausnahmen verwendet werden, verliert dies so ziemlich alle Nützlichkeit. Außerdem erschweren geprüfte Ausnahmen das Erstellen einer zeitstabilen API. Die Implementierung eines generischen Systems innerhalb einer bestimmten Domäne bringt eine Menge außergewöhnlicher Situationen mit sich, die mit ausschließlich geprüften Ausnahmen nur schwer aufrechtzuerhalten sind.
Nicht aktivierte Ausnahmen - viel vielseitiger als aktivierte Ausnahmen dokumentieren sie die möglichen Ausnahmesituationen einer bestimmten Implementierung nicht richtig. Sie stützen sich, wenn überhaupt, auf Ad-hoc-Dokumentation. Dies führt zu Situationen, in denen die Unzuverlässigkeit eines Mediums durch eine API maskiert wird, die den Anschein von Zuverlässigkeit erweckt. Auch wenn diese Ausnahmen ausgelöst werden, verlieren sie ihre Bedeutung, wenn sie sich wieder durch die Abstraktionsschichten bewegen. Da sie schlecht dokumentiert sind, kann ein Programmierer sie nicht gezielt ansprechen und muss häufig ein viel breiteres Netz als erforderlich bereitstellen, um sicherzustellen, dass sekundäre Systeme im Falle eines Ausfalls nicht das gesamte System herunterfahren. Damit kommen wir gleich wieder auf das Problem des Schluckproblems zurück.
Rückgabetypen mit mehreren Zuständen Hier muss auf eine disjunkte Menge, ein Tupel oder ein ähnliches Konzept zurückgegriffen werden, um entweder das erwartete Ergebnis oder ein Objekt zurückzugeben, das die Ausnahme darstellt. Hier kein Abwickeln des Stapels, kein Durchschneiden des Codes, alles wird normal ausgeführt, aber der Rückgabewert muss vor dem Fortfahren auf Fehler überprüft werden. Ich habe noch nicht wirklich damit gearbeitet, kann also aus Erfahrung keinen Kommentar abgeben. Ich gebe zu, dass es einige Probleme löst, Ausnahmen, die den normalen Fluss umgehen, aber es wird immer noch unter den gleichen Problemen leiden wie die überprüften Ausnahmen, da es lästig und ständig "in deinem Gesicht" ist.
Die Frage ist also:
Welche Erfahrungen haben Sie in dieser Angelegenheit gemacht und was ist Ihrer Meinung nach der beste Kandidat, um ein gutes Ausnahmebehandlungssystem für eine Sprache zu entwickeln?
EDIT: Wenige Minuten nach dem Schreiben dieser Frage bin ich auf diesen Beitrag gestoßen, gruselig!
noexcept
Geschichte in C ++ kann auch für EH in C # und Java sehr gute Einblicke liefern.)