Was ist der Vorteil von try {} catch {} im Vergleich zu if {} else {}
Ich bin, Wechsel von Gleit-mysql in php mit PDO und ich habe bemerkt, dass der gemeinsame Weg, um auf Fehler zu testen ist mit einem try /catch-Kombination anstelle von if /else Kombinationen.
Was ist der Vorteil von dieser Methode kann ich verwenden einen try /catch-block anstelle der verschachtelten if /else-Blöcke für die Behandlung aller Fehler für die einzelnen Schritte (verbinden, bereiten, ausführen, etc.)?
InformationsquelleAutor der Frage jeroen | 2009-03-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Würde ich die try/catch-block, wenn der normale Weg durch den code gehen ohne Fehler, es sei denn, es gibt wirklich einige außergewöhnliche Umstände -- wie die server heruntergefahren ist, Ihre Anmeldeinformationen abgelaufen sind oder falsch. Ich würde nicht unbedingt verwenden, es zu behandeln, die nicht-zufällige Fehler-sagen wie der aktuelle Benutzer nicht in der richtigen Rolle. Das heißt, wenn Sie erwarten können, und Griff ein Fehler, dass ist kein außergewöhnlicher Zustand, ich denke, Sie sollten tun, Ihre Schecks.
In dem Fall, den Sie beschrieben haben -- einrichten und ausführen einer Abfrage, eines try/catch-block ist eine ausgezeichnete Weise, es zu handhaben, wie Sie es normalerweise erwarten, dass die Abfrage erfolgreich zu sein. Auf der anderen Seite, werden Sie wahrscheinlich wollen, um zu überprüfen, dass der Inhalt der Ergebnis das sind, was Sie erwarten, mit Kontrollfluss-Logik eher als nur versuchen, die Daten verwenden, die möglicherweise nicht gültig für Ihren Zweck.
Eine Sache, die Sie betrachten wollen, ist die schlampige Verwendung von try/catch. Try/catch-sollte nicht verwendet werden, um sich selbst zu schützen von schlechten Programmierung -- "ich weiß nicht, was passieren wird, wenn ich dies tun, so werde ich wickeln Sie es in ein try/catch und hoffe das beste" Art der Programmierung. In der Regel werden Sie wollen, um zu beschränken die Arten von Ausnahmen, die Sie fangen jene, die nicht im Zusammenhang mit dem code selbst (server down, bad Anmeldeinformationen, etc.) so dass Sie finden und beheben Fehler, sind code-bezogene (null-Zeiger, etc.).
InformationsquelleAutor der Antwort tvanfosson
Allgemein try-catch-Blöcke sind groß, weil Sie brechen (nach der catch-Anweisung), wenn die Ausnahme Auftritt. If-else-Blöcke auf Sie verlassen Vorhersage, Wann der Fehler passiert.
Bearbeiten:
Auch catch-Blöcken wird nicht aufhören, der code Stoppt, wenn ein Fehler gefunden wird.
InformationsquelleAutor der Antwort Perchik
Try/Catch-völlig trennt die Logik zur Fehlerverarbeitung aus dem Objekt business-Logik.
InformationsquelleAutor der Antwort Trap
Den Vorteil, try/catch, und Ausnahmen im Allgemeinen, ist mehr für die Leute Entwicklung Bibliotheken, wie die PDO. Sie erlauben ein system-Entwickler zu behandeln Undefinierte Situationen oder unerwartete Ergebnisse in eine schnelle und einfache Weise. Nehmen Sie eine Datenbank-Verbindung. Was sollte ein system tun, wenn die Datenbank nicht erreicht werden kann. Sollte es angehalten? Versuchen Sie es erneut? Werfen Sie einen warn-und weiter? Die system-Entwickler können nicht wissen, was Sie brauchen, es zu tun, Sie werfen Sie eine Ausnahme, die Sie später erfassen und zu verarbeiten.
Der Vorteil für Sie als Verbraucher ist das system eher, als sich eine vage Fehlermeldung zurück, oder eine einfache boolean-false, dass es fehlgeschlagen ist, erhalten Sie eine Exception-Objekt wird
Werden so benannt, dass es mehr offensichtlich ist, was falsch gelaufen ist (Wenn ich mich Recht erinnere, PDO hat nur eine Ausnahme geben, aber auch andere Systeme enthalten mehrere exception-Typen für verschiedene Arten von Fehlern)
Kann/sollte enthalten Methoden und Eigenschaften, die helfen können Sie herausfinden, warum die exception geworfen wurde
Das ist die Theorie sowieso. Es gibt viele kluge Menschen, die behaupten, Ausnahmen sind der Weg zu gehen. Es gibt auch viele intelligente Leute, die denken, Ausnahmen sind der Teufel, und eine Krücke für faule system-Entwickler. Es gibt nichts ähnlich Konsens in dieser Frage.
InformationsquelleAutor der Antwort Alan Storm
Genau das ist ja der Vorteil, mit einem try/catch-statt mehrerer if-Anweisungen. Sie werden auch in der Lage sein zu fangen unvorhergesehene Fehler.
InformationsquelleAutor der Antwort Shaun Humphries
Werfen und fangen einer Ausnahme ist eine teure operation im Vergleich zu den meisten anderen primitiven Betrieb. Wenn dies ist ein Stück code ausführen muss (z.B. in einer engen Schleife), Sie möchten sich auf Ihre use - case -, wenn Sie erwarten, dass die Ausnahmen geworfen werden relativ oft, werden Sie besser mit einer if/else-perforance-Weise (es sei denn, der zugrunde liegende code ist nur Verpackung eine Ausnahme für dich, in dem Fall gibt es auch keinen Gewinn). Wenn die Ausnahmen werden nur ausgelöst, in seltenen Fällen, dann sind Sie besser dran mit einem try/catch zu vermeiden, den Aufwand der Verzweigung in eine enge Schleife.
InformationsquelleAutor der Antwort Not Sure
Seit PDO ist über Objekte, Sie sind die Ausnahmen auslösen, wenn ein Fehler auftreten. Die alte mysql/mysqli waren bloße Funktionen und nicht Ausnahmen werfen Sie einfach zurückgegeben Fehler-codes. Try/catch wird verwendet, wenn eine Ausnahme geworfen werden kann aus dem code, und Sie fangen in der catch-Klausel, die eine objektorientierte Art und Weise, um Fehler zu behandeln. Sie können nicht fangen von Ausnahmen mit if/else-Blöcke - Sie teilen nichts mit try/catch.
InformationsquelleAutor der Antwort Björn
@Perchik:
Meine Allgemeine Philosophie der Fehlerbehandlung:
Du sollte Verwendung if /else auf alle Fälle behandeln, die Sie erwarten. Sollten Sie nicht mit try {} catch {} zu behandeln alles (in den meisten Fällen), weil eine sinnvolle Ausnahme kann angehoben werden und Sie können lernen, über die Anwesenheit von einem bug aus. Sie sollte mit try {} catch {} in Situationen, in denen Sie vermuten, dass etwas kann/wird schief gehen und Sie nicht wollen, es zu bringen auf dem ganzen system, wie der Netzwerk-timeout/- Datei, Zugriff auf das system Probleme, Dateien nicht vorhanden, etc.
Leidige Ausnahmen
InformationsquelleAutor der Antwort Jared Updike
Alle anderen hatten gute Antworten - aber ich dachte, ich würde werfen in meiner eigenen:
InformationsquelleAutor der Antwort Adam Nelson
In php durch die Verwendung von Try Catch mit inheritence, können Wir werfen Ausnahme von einer anderen Klasse.
Beispiel :- ich bin in der
controller
und Validierung der Benutzerdaten durch die Verwendung vonModels
.Wenn irgendein Fehler auslöst, ich muss nur werfen eine Ausnahme von
Model
Methoden.Ausführung in versuchen wird zu brechen und Rang in der
Catch
Block.So gibt Es weniger overhead, Rückkehr bool vales und Prüfung.
Abgesehen von diesem
Try Catch
funktioniert hervorragend, Wenn mit in der Kette (Try - Catch
in einem anderenTry - Catch
).InformationsquelleAutor der Antwort Amit Singh
Völlig einverstanden mit @Jared Updike
Regel-Ausnahme-Behandlung erfolgt mit der Nutzer wissen wenig oder nichts darüber. Auf der anderen Seite, der Nutzer, der das system kennt, was geschieht innerhalb einer if-else-block.
zB. Es sollte eine "else" - Klausel, zeigt ein ATM-Benutzer, wird die Meldung "nicht genügend Guthaben", wenn er das Gleichgewicht ist gering. Und diese Botschaft kann NICHT sein, die sitzt in einem "catch" - block Gründen !!
InformationsquelleAutor der Antwort Vijay Dev