Ich habe gehört, dass die Verwendung von Ausnahmen für den Kontrollfluss eine schlechte Übung ist. Was denkst du darüber?
%Vor% Wenn also keine Übereinstimmung gefunden wurde, werden die Eingaben -1 sein. Dies wird eine Ausnahme verursachen, wenn ich versuche, den Teilstring g0.substring(0, -1)
zu übernehmen. Dann gibt die Funktion nur ein Objekt zurück, das anzeigt, dass keine Übereinstimmung gefunden wurde.
Ist das eine schlechte Übung? Ich könnte einfach jeden Index manuell überprüfen, um zu sehen, ob sie alle -1 sind, aber das fühlt sich an wie mehr Arbeit.
AKTUALISIEREN
Ich habe den try-catch-Block entfernt und ihn mit folgendem ersetzt:
%Vor% Was ist besser: Überprüfen Sie, ob jede Variable -1 ist, oder verwenden Sie eine boolesche foundMatch
, um den Überblick zu behalten und überprüfen Sie dies am Ende?
Im Allgemeinen sind Ausnahmen teure Operationen und, wie der Name vermuten lässt, außergewöhnliche Bedingungen. Es ist in der Tat eine schlechte Praxis, sie im Kontext der Kontrolle des Ablaufs Ihrer Anwendung zu verwenden.
Insbesondere in dem von Ihnen bereitgestellten Beispiel müssten Sie einige grundlegende Überprüfungen der Eingaben vornehmen, die Sie dem StringMatch-Konstruktor bereitstellen. Wenn es eine Methode gibt, die einen Fehlercode zurückgibt, falls eine grundlegende Parametervalidierung fehlschlägt, könnten Sie es vermeiden, vorher zu prüfen, aber das ist nicht der Fall.
Ich habe ein paar Tests gemacht. Bei modernen JVMs wirkt sich dies (wenn überhaupt) kaum auf die Laufzeitleistung aus. Wenn Sie mit aktiviertem Debuggen laufen, verlangsamt es die Geschwindigkeit erheblich.
Siehe Details
(Ich sollte auch erwähnen, dass ich immer noch denke, dass dies eine schlechte Übung ist, auch wenn es die Leistung nicht beeinträchtigt. Mehr als alles andere reflektiert es ein möglicherweise schlechtes Algorithmusdesign, das schwer zu testen sein wird) >
Ja, das ist eine schlechte Übung, besonders wenn Sie eine Möglichkeit haben, eine Ausnahme zu vermeiden (überprüfen Sie die Länge der Zeichenkette, bevor Sie versuchen, darin zu indizieren). Try und Catch-Blöcke sind so ausgelegt, dass sie "normale" Logik von "Ausnahme" und Fehlerlogik partitionieren. In Ihrem Beispiel haben Sie "normale" Logik in den Ausnahme- / Fehlerblock gespreizt (das Finden einer Übereinstimmung ist nicht außergewöhnlich). Sie missbrauchen auch substring
, damit Sie den Fehler, der als Kontrollfluss erzeugt wird, nutzen können.
Der Programmablauf sollte so geradlinig wie möglich sein (da selbst dann Anwendungen ziemlich komplex werden) und Standardsteuerungsflußstrukturen verwenden. Der nächste Entwickler, der den Code berührt, ist möglicherweise nicht Sie und (zu Recht) missverstehen Sie die nicht-standardmäßige Art, in der Sie Ausnahmen anstelle von Bedingungen verwenden, um den Steuerungsfluss zu bestimmen.
Ich kämpfe jetzt ein bisschen anders bei diesem Problem während einiger Legacy-Code-Refactoring.
Das größte Problem, das ich bei diesem Ansatz finde, ist, dass die Verwendung von try / catch den normalen programmatischen Ablauf unterbricht.
In der Anwendung, an der ich arbeite (und das unterscheidet sich von dem Beispiel, das Sie angewendet haben), werden Ausnahmen verwendet, um innerhalb eines Methodenaufrufs ein bestimmtes Ergebnis zu kommunizieren (z. B. nach einer Kontonummer suchen und diese nicht finden). aufgetreten. Dies erzeugt Spaghetti-Code auf der Client-Seite, da die aufrufende Methode (während eines nicht-außergewöhnlichen Ereignisses oder eines normalen Anwendungsfall-Ereignisses) aus dem Code, der vor dem Aufruf ausgeführt wurde, in den catch-Block ausbricht. Dies wird in einigen sehr langen Methoden oft wiederholt, wodurch der Code sehr leicht falsch gelesen werden kann.
Für meine Situation sollte eine Methode einen Wert pro Unterschrift für alle außer wirklich außergewöhnlichen Ereignissen zurückgeben. Der Ausnahmebehandlungsmechanismus beabsichtigt, beim Auftreten der Ausnahme einen anderen Pfad zu wählen (versuchen Sie, innerhalb der Methode eine Wiederherstellung durchzuführen, damit Sie immer noch normal zurückkehren können).
Meiner Meinung nach könnten Sie das tun, wenn Sie Ihre try / catch-Blöcke sehr eng aneinander ausrichten; aber ich denke, es ist eine schlechte Angewohnheit und kann zu Code führen, der sehr leicht falsch interpretiert werden kann, da der aufrufende Code jede ausgelöste Ausnahme als 'GOTO' Nachricht interpretiert und den Programmablauf verändert. Ich befürchte, dass, obwohl dieser Fall nicht in diese Falle gerät, dies oft zu einer Kodierung führen könnte, die zu dem Albtraum führt, den ich gerade lebe.
Und dieser Albtraum ist nicht angenehm.
Tags und Links java exception control-flow