Sollen Catch-Blöcke zum Schreiben von Logik verwendet werden, z. B. zur Flusskontrolle? Oder nur um Ausnahmen zu werfen? Beeinflusst es die Effizienz oder Wartbarkeit von Code?
Was sind die Nebenwirkungen (falls vorhanden) des Schreibens von Logik in den Catch-Block?
BEARBEITEN:
Ich habe eine Java SDK-Klasse gesehen, in der sie Logik in den catch-Block geschrieben haben. Zum Beispiel (Ausschnitt aus der java.lang.Integer
Klasse):
try {
result = Integer.valueOf(nm.substring(index), radix);
result = negative ? new Integer(-result.intValue()) : result;
} catch (NumberFormatException e) {
String constant = negative ? new String("-" + nm.substring(index))
: nm.substring(index);
result = Integer.valueOf(constant, radix);
}
EDIT2 :
Ich habe ein Tutorial durchlaufen, in dem sie es als einen Vorteil beim Schreiben der Logik von Ausnahmefällen innerhalb der Ausnahmen ansehen:
Mit Ausnahmen können Sie den Hauptfluss Ihres Codes schreiben und die Ausnahmefälle an anderer Stelle behandeln.
Gibt es spezielle Richtlinien, wann Logik in einen catch-Block geschrieben werden soll und wann nicht?
quelle
Antworten:
Das Beispiel, das Sie zitieren, ist auf ein schlechtes API-Design zurückzuführen (es gibt keinen sauberen Weg, um zu überprüfen, ob ein String eine gültige Ganzzahl ist, es sei denn, Sie versuchen, ihn zu analysieren und die Ausnahme abzufangen).
Auf technischer Ebene sind throw und try / catch Kontrollflusskonstrukte , mit denen Sie den Aufrufstapel hochspringen können, nicht mehr und nicht weniger. Das Hochspringen des Aufrufstapels verbindet implizit Code, der in der Quelle nicht nahe beieinander liegt, was für die Wartbarkeit schlecht ist . Es sollte also nur verwendet werden, wenn Sie dies tun müssen, und die Alternativen sind noch schlimmer. Der allgemein akzeptierte Fall, in dem die Alternativen schlechter sind, ist die Fehlerbehandlung (spezielle Rückkehrcodes, die überprüft und manuell auf jeder Ebene des Aufrufstapels weitergegeben werden müssen).
Wenn Sie einen Fall haben, in dem die Alternativen schlechter sind (und Sie wirklich alle sorgfältig überlegt haben), dann würde ich sagen, dass die Verwendung von werfen und versuchen / fangen für den Kontrollfluss in Ordnung ist. Dogma ist kein guter Ersatz für Urteilsvermögen.
quelle
Dies ist in der Regel abhängig von Sprache und Paradigma.
Die meiste Arbeit erledige ich in Java (und manchmal in C ++). Die Tendenz besteht darin, Ausnahmen nur für Ausnahmebedingungen zu verwenden. Bei Stack Overflow gibt es einige Fragen zum Performance-Overhead von Ausnahmen in Java , und wie Sie sehen können, ist dies nicht unbedingt zu vernachlässigen. Es gibt auch andere Bedenken, wie zum Beispiel die Lesbarkeit und Wartbarkeit des Codes. Bei ordnungsgemäßer Verwendung können Ausnahmen die Fehlerbehandlung an die entsprechenden Komponenten delegieren.
In Python herrscht jedoch die Vorstellung, dass es einfacher ist, um Verzeihung zu bitten, als um Erlaubnis. In der Python-Community wird dies als EAFP bezeichnet. Dies steht im Gegensatz zum LBYL- Ansatz (Look Before You Jump ) in C-Sprachen.
quelle
Das ist nicht die beste Art, über Try / Catch-Blöcke nachzudenken. Die Art und Weise, über Try / Catch-Blöcke nachzudenken, ist folgende: Es ist ein Fehler aufgetreten. Hier ist der beste Ort, um diesen bestimmten Fehler zu beheben. Das kann die nächste Codezeile sein, es können zwanzig Ebenen in der Aufrufkette sein. Wo immer es ist, dort sollte es sein.
Was der catch-Block macht, hängt vom Fehler ab und was Sie dagegen tun können. Manchmal kann es einfach ignoriert werden (Fehler beim Löschen einer Arbeitsdatei ohne wichtige Daten), manchmal wird es verwendet, um den Rückgabewert einer Funktion auf true oder false zu setzen (Java-Methode int parse), manchmal wird das Programm beendet . Das hängt alles vom Fehler ab.
Der wichtige Teil, den man verstehen muss, ist: catch block == Ich weiß, wie man damit umgeht.
quelle
Catch-Blöcke sollten nur für die Behandlung von Ausnahmen verwendet werden, nichts anderes und niemals für den Kontrollfluss. In jeder Situation, in der Sie Ausnahmen zum Verwalten des Datenflusses verwenden möchten, sollten Sie die Voraussetzungen überprüfen.
Der Ablauf mit Ausnahmen ist langsam und semantisch inkorrekt.
quelle
Vergessen Sie zunächst den Begriff "Ausnahmen sollten für außergewöhnliche Bedingungen verwendet werden". Sorgen Sie sich auch nicht mehr um die Effizienz, bis Sie Code haben, der nicht akzeptabel funktioniert, und Sie gemessen haben, um zu wissen, wo das Problem liegt.
Code ist am einfachsten zu verstehen, wenn Aktionen in einer einfachen Reihenfolge ohne Bedingungen ausgeführt werden. Ausnahmen verbessern die Wartbarkeit, indem Fehlerprüfungen aus dem normalen Ablauf entfernt werden. Es spielt keine Rolle, ob die Ausführung zu 99,9% der Zeit oder zu 50% der Zeit oder zu 20% der Zeit dem normalen Ablauf folgt.
Auslösen einer Ausnahme, wenn eine Funktion keinen Wert zurückgeben kann, wenn eine Prozedur die erwartete Aktion nicht ausführen kann oder wenn ein Konstruktor kein verwendbares Objekt erstellen kann. Auf diese Weise können Programmierer davon ausgehen, dass eine Funktion immer ein verwendbares Ergebnis liefert, eine Prozedur die angeforderte Aktion immer abschließt und ein erstelltes Objekt immer in einem verwendbaren Zustand ist.
Das größte Problem, das ich mit dem Code zur Ausnahmebehandlung sehe, ist, dass Programmierer Try / Catch-Blöcke schreiben, wenn sie dies nicht sollten. Wenn beispielsweise in den meisten Webanwendungen eine Datenbankanforderung eine Ausnahme auslöst, kann auf dem Controller nichts ausgeführt werden. Eine generische Fangklausel auf höchster Ebene reicht aus. Dann kann der Controller-Code die Möglichkeit, dass die Festplatte abgestürzt ist oder die Datenbank offline ist, oder was auch immer, auf selige Weise ignorieren.
quelle
Catch-Blöcke sollten nicht zum Schreiben von Codelogik verwendet werden. Sie sollten nur zur Fehlerbehandlung verwendet werden. Ein Beispiel ist (1) Bereinigen aller zugewiesenen Ressourcen, (2) Drucken einer nützlichen Nachricht und (3) ordnungsgemäßes Beenden.
Es ist richtig, dass Ausnahmen missbraucht werden und unerwünschte
goto
Auswirkungen haben können. Aber das macht sie nicht unbrauchbar. Bei richtiger Verwendung können sie viele Aspekte Ihres Codes verbessern.quelle