Geben Sie mir einige Ihrer Gedanken darüber, was eine bessere Kodierungspraxis ist / macht effizienteren Code / sieht hübscher aus / was auch immer: Erhöhen und verbessern Sie Ihre Fähigkeit, if-Anweisungen zu verwenden, um potenzielle Probleme vorherzusehen und zu erkennen? Oder einfach nur versuchen / fangen im Allgemeinen?
Sagen wir, das ist für Java (wenn es darauf ankommt).
Edit: Ich überwinde mich derzeit von einigen zugegebenermaßen veralteten und eingeschränkten aktuellen Programmierpraktiken, aber ich bin ein wenig hin und hergerissen von der Notwendigkeit, dies in einigen Punkten zu tun (z als dies). Ich frage einfach nach ein paar Perspektiven dazu. Keine Debatte.
if
Blöcke sind etwas schneller; Wenn Sie nicht ein Dutzend von ihnen brauchen, sind sie eine bessere Idee als try/catches
. Ausnahmen sollten außergewöhnlich sein, nicht jedes Mal, wenn der Code ausgeführt wird. Ich verwende Exceptions für seltene Ereignisse wie Server-Disconnections (obwohl sie ein paar Mal jeden Tag passieren) und if
Blöcke für jede meiner steuerbaren Variablen.
Unabhängig davon, welchen Code Sie schreiben, werden Sie beide verwenden. Ich kann nicht für die Java-Laufzeit sprechen, aber in der .NET-Laufzeitumgebung gibt es einen Leistungseinbruch, der mit der Verwendung von try-catch-Blöcken verbunden ist. Daher versuche ich, sie nur in Bereichen zu verwenden, in denen ich eine eindeutige Möglichkeit habe, mit der Ausnahme fertig zu werden, sobald sie abgefangen wurde (selbst wenn nur das Vorhandensein eines Problems protokolliert wird).
Wenn Sie viele try-catch-Blöcke oder if-else-Blöcke in Ihrem Code verwenden oder Ihre Methoden eher lang sind, sollten Sie den Code in eine größere Anzahl kleinerer Methoden umwandeln. Die Absicht Ihrer Logik wird einfacher zu verfolgen sein - und auch einfacher zu Unit-Test.
Ich denke, wenn Aussagen besser sind. Sie können nicht jede Codezeile mit einem try..catch (Sie können, aber Sie sollten es nicht tun) umgeben. Sie können einen Codeblock mit try catch, aber nicht mit jeder Zeile umgeben.
Und Ausnahmen verlangsamen die Dinge.
Mein 2p: Verwenden Sie versuchen / fangen ist am besten:
Nach meiner Erfahrung macht die Verwendung von if-Bedingungslogik die Unterscheidung zwischen Fehlerbehandlung und Geschäftslogik schwieriger.
Nach dem, was mir erfahrenere Entwickler und Analysten gesagt haben, ist try / catch eher objektorientiert und ob es mehr prozedural ist.
Mir persönlich ist das egal.
Ich bin mir der Tatsache bewusst, dass ein try / catch langsamer ist und einen Leistungseinbruch verursacht, aber wenn ich ein Dutzend ifs zur Validierung verwende, bevor ich tun kann, was ich tun will, werde ich immer verwenden Ein Versuch / Fang, um die Anzahl der Codezeilen zu sparen.
Es macht mein Leben so viel einfacher, nichts validieren zu müssen und wenn die Aussage fehlschlägt, tue einfach das, was ich in meinem 'else' Block getan hätte ... in meinem 'Fang' Block.
Manchmal schließe ich natürlich einige if-Anweisungen in einen try / catch ein, aber trotzdem.
Ich benutze ein if, wenn nur eine kleine Anzahl von Dingen zu validieren ist (1 oder 2), bevor ich mache, was ich tun muss.
Es gibt eine Sache, die hier nicht erwähnt wurde.
Mit einer if-else-Anweisung wird jedes Mal, wenn der Code ausgeführt wird, mindestens 1 der Bedingung garantiert ausgeführt. Ich bin mir sicher, dass wir alle wissen, wie ein if-else-elseif funktioniert, aber um klar zu sein ... der if Teil der Anweisung wird immer ausgewertet, wenn er falsch ist, dann der folgende else-if wird ausgewertet, und so weiter, bis nur noch else ausgewertet werden kann.
Wenn Sie also eine if-else-Anweisung verwenden, wirkt sich dies auf Ihre Leistung aus. Nicht signifikant (in den meisten Fällen), aber es dauert CPU-Zeit, um die Auswertungen durchzuführen.
try-catch-Anweisungen, und korrigieren Sie mich, wenn ich falsch liege, nicht zur Laufzeit berücksichtigt werden, bis sie benötigt werden (d. h. eine Ausnahme wird ausgelöst). Wenn Sie also Ihren Code einfach in einen try-catch-Code einschließen, wirkt sich dies erst auf die Leistung aus, wenn eine Ausnahme tatsächlich von der Ausnahme erfasst wird.
Es ist auch nicht der Catch, der den Performance-Hit verursacht, sondern der Throw.
Und ein wichtiger Punkt ist, try-catch-Anweisungen sollten niemals für bedingte Logik verwendet werden. Sie sollten nur für das verwendet werden, wofür sie entworfen wurden: Ausnahmebehandlung!
Das Einfangen von Ausnahmen ist wichtig, wenn Sie wissen, was Sie damit machen sollen. Wenn Sie keine Möglichkeit haben, die Ausnahme richtig zu behandeln, sollten Sie sie loslassen. Für etwas Code weiter oben könnte die Kette einen besseren Weg haben, um mit der Ausnahme umzugehen.
Es ist normalerweise eine gute Idee, einen Ausnahme-Handler auf der absoluten obersten Ebene Ihrer Anwendung zu haben, um Ausnahmen abzufangen, bevor sie vom Benutzer gesehen werden. In ASP.NET können Sie dies im Application_Error-Ereignis von global.asax tun. In anderen Sprachen / Umgebungen würden Sie dies in Ihrer Hauptschleife tun, was auch immer das sein mag.
Aber beachten Sie, es gibt einige Ausnahmen, die immer am besten unberücksichtigt bleiben. Wenn eine Ausnahme auftritt, ist dies manchmal ein Anzeichen dafür, dass der Status Ihrer Anwendung stark beeinträchtigt wurde und nicht vertrauenswürdig ist. Die einzige sichere Sache ist zu töten und neu zu starten.
@PersonalPerson - Entschuldigung, aber das ist nur eine faule Codierung. Anstatt einen try-catch zu verwenden, weil es zu viele if-Anweisungen gibt, warum sollte der Code nicht umgestaltet werden (d. H., Sie müssen Ihre Validierungslogik in einer eigenen Methode implementieren). Dadurch bleibt Ihr Code sauberer und besser lesbar und es werden Best Practices für die Leistung beibehalten.
Versuchen Sie niemals, Ihren Code zu schreiben, um die wenigsten Zeilen zu erhalten. Das wird immer schlecht enden. Sicher, Sie können einen eleganteren Weg finden, etwas zu schreiben, mit dem Ihre Coder-Buddies zufrieden sein werden, aber es macht die Dinge nur weniger lesbar.
Ich schwöre, ich habe vorher mit Ihrem Code gearbeitet und es hat meinen Kopf verletzt.
Das Verwenden von Exceptions ist eine universelle Methode, um anderen Teilen des Codes mitzuteilen, dass etwas in losem Zusammenhang passiert ist. Stellen Sie sich vor, dass wenn Sie einige außergewöhnliche Bedingungen behandeln möchten, indem Sie verwenden .. nad else .. Sie müssen in verschiedenen Teil Ihres Codes einige willkürliche Variablen und andere Dinge einfügen, die wahrscheinlich bald Spaghetti-Code führen würde.
Als Nächstes stellen Sie sich vor, dass Sie eine externe Bibliothek / ein externes Paket verwenden und dass der Autor seinen Code auf andere willkürliche Weise eingegeben hat, um mit falschen Zuständen umzugehen - es würde Sie beispielsweise zwingen, sich damit zu befassen Sie müssten prüfen, ob bestimmte Methoden Wahr oder Falsch oder was auch immer zurückgeben.
Die Verwendung von Exceptions macht die Handhabung von Fehlern viel einfacher - Sie gehen einfach davon aus, dass der andere Code eine Exception auslöst, also fügen Sie den Code einfach in try block ein und behandeln mögliche Exceptions auf Ihre eigene Art.
Tags und Links comparison if-statement try-catch