it-swarm.com.de

Was ist der Vorteil von try {} catch {} vs if {} else {}

Ich wechsle von normalem mysql in php zu PDO, und ich habe festgestellt, dass die übliche Methode zum Testen von Fehlern die Verwendung einer try/catch-Kombination anstelle von if/else-Kombinationen ist.

Was ist der Vorteil dieser Methode? Kann ich einen try/catch-Block anstelle mehrerer verschachtelter if/else-Blöcke verwenden, um alle Fehler für die verschiedenen Schritte (Verbinden, Vorbereiten, Ausführen usw.) zu behandeln?

53
jeroen

Ich würde den try/catch-Block verwenden, wenn der normale Pfad durch den Code ohne Fehler fortgesetzt werden sollte, es sei denn, es gibt Ausnahmebedingungen, z. B. wenn der Server inaktiv ist, Ihre Anmeldeinformationen abgelaufen oder falsch sind. Ich würde es nicht unbedingt verwenden, um nicht außergewöhnliche Fehler zu behandeln - beispielsweise, dass der aktuelle Benutzer nicht die richtige Rolle spielt. Wenn Sie also einen Fehler erwarten und behandeln können, der keine Ausnahmebedingung ist, sollten Sie Ihre Überprüfungen durchführen.

In dem Fall, den Sie beschrieben haben - das Einrichten und Durchführen einer Abfrage, ist ein Try/Catch-Block eine hervorragende Möglichkeit, damit umzugehen, da Sie normalerweise davon ausgehen, dass die Abfrage erfolgreich ist. Andererseits möchten Sie wahrscheinlich mit der Ablaufsteuerungslogik prüfen, ob der Ergebnisinhalt Ihren Erwartungen entspricht, und nicht nur versuchen, Daten zu verwenden, die möglicherweise nicht für Ihren Zweck gültig sind.

Eine Sache, auf die Sie achten sollten, ist die schlampige Verwendung von try/catch. Try/catch sollte nicht dazu verwendet werden, sich vor schlechter Programmierung zu schützen - die "Ich weiß nicht, was passiert, wenn ich dies tue, also werde ich es in eine Try/Catch einpacken und auf das Beste hoffen" der Programmierung. Normalerweise sollten Sie die Art der Ausnahmen, die Sie einfangen, auf diejenigen beschränken, die nicht mit dem Code selbst zusammenhängen (Serverausfall, falsche Anmeldeinformationen usw.), sodass Sie Fehler finden und beheben können, die mit Code in Zusammenhang stehen (Nullzeiger usw. .). 

51
tvanfosson

In der Regel sind Try-Catch-Blöcke großartig, da sie bei Auftreten der Ausnahmebedingung brechen (zur Catch-Anweisung wechseln). If-else-Blöcke sind darauf angewiesen, dass Sie voraussagen, wann der Fehler auftritt.

Edit: Außerdem halten catch-Blöcke Ihren Code nicht an, wenn ein Fehler auftritt.

15
Perchik

Try/Catch trennt die Fehlerbehandlungslogik vollständig von der Objektgeschäftslogik.

7
Trap

Der Vorteil von try/catch und Ausnahmen im Allgemeinen liegt eher bei den Leuten sich entwickelnden Bibliotheken wie PDO. Sie ermöglichen einem Systementwickler, schnell und einfach mit undefinierten Situationen oder unerwarteten Ergebnissen umzugehen. Nehmen Sie eine Datenbankverbindung. Was sollte ein System tun, wenn die Datenbank nicht erreichbar ist? Sollte es die Ausführung anhalten? Versuchen Sie es nochmal? Eine Warnung auslösen und fortfahren? Der Systementwickler kann nicht wissen, was Sie tun müssen. Er löst eine Ausnahme aus, die Sie später abfangen und behandeln werden.

Der Vorteil für Sie als Konsument des Systems besteht darin, dass Sie kein vages Fehlercode zurückerhalten oder ein einfaches boolesches falsches, dass es fehlgeschlagen ist, ein Exception-Objekt erhalten, das dies bewirkt

  1. Benennen Sie es so, dass es offensichtlicher ist, was schief gelaufen ist (Wenn ich mich recht erinnere, hat PDO nur einen Ausnahmetyp, aber andere Systeme enthalten mehrere Ausnahmetypen für verschiedene Arten von Fehlern).

  2. Kann/sollte Methoden und Eigenschaften enthalten, mit denen Sie herausfinden können, warum die Ausnahme wurde ausgelöst

Das ist sowieso die Theorie. Es gibt viele kluge Leute, die behaupten, Ausnahmen seien der richtige Weg. Es gibt auch viele kluge Leute, die glauben, Ausnahmen seien der Teufel und eine Krücke für faule Systementwickler. In dieser Frage gibt es keinen vergleichbaren Konsens.

7
Alan Storm

Das Auslösen und Erfassen einer Ausnahme ist im Vergleich zu den meisten anderen primitiven Operationen ein teurer Vorgang. Wenn dies ein Code ist, der gut funktionieren muss (z. B. in einer engen Schleife), sollten Sie sich Ihren Anwendungsfall anschauen. Wenn Sie davon ausgehen, dass die Ausnahmen relativ häufig ausgelöst werden, sind Sie mit einem if besser beraten/else Perforation-Wise (es sei denn, der zugrunde liegende Code ist nur eine Ausnahme für Sie. In diesem Fall gibt es keinen Gewinn). Wenn die Ausnahmen nur in seltenen Fällen ausgelöst werden, sollten Sie Try/Catch verwenden, um den Overhead der Verzweigungen in einer engen Schleife zu vermeiden. 

6
Not Sure

Das ist genau der Vorteil, wenn Sie anstelle von mehreren if-Anweisungen ein try/catch verwenden. Sie können auch unerwartete Fehler feststellen.

5
Shaun Humphries

@ Perchik:

Meine allgemeine Philosophie der Fehlerbehandlung:

Sie sollten verwenden if/else, um alle Fälle zu behandeln, die Sie erwarten. Sie sollten nicht versuchen, try {} catch {} zu verwenden, um alles zu behandeln (in den meisten Fällen), da eine nützliche Exception ausgelöst werden könnte und Sie das Vorhandensein eines Fehlers erkennen können. Sollte versuchen Sie try {} catch {} in Situationen, in denen Sie vermuten, dass etwas schief gehen kann/soll und Sie nicht möchten, dass das gesamte System heruntergefahren wird, wie Netzwerk-Timeout/Dateisystemzugriffsprobleme, Dateien existiert nicht usw.

Ärgerliche Ausnahmen

5
Jared Updike

Alle anderen hatten gute Antworten - aber ich dachte, ich würde meine eigene einbringen:

  1. Try/Catch ist ein tatsächlicher Ausnahmebehandlungsmechanismus. Wenn Sie also Ihre Ausnahmen ändern, werden alle Try/Catch-Anweisungen automatisch ausgeführt.
  2. Try/Catch bietet die Möglichkeit, Code auszuführen, selbst wenn eine große Ausnahmebedingung auslöst, die das if/else abtöten könnte. Außerdem kann die try-Anweisung zurückgesetzt werden (wenn Sie sich auskennen).
3
Adam Nelson

Da PDO Objekte verwendet, werden im Fehlerfall Ausnahmen ausgelöst. Die alten mysql/mysqli waren bloße Funktionen und werfen keine Ausnahmen. Sie gaben einfach Fehlercodes zurück. Try/catch wird verwendet, wenn eine Exception aus dem Code geworfen werden kann und Sie sie in der catch-Klausel abfangen. Dies ist eine objektorientierte Methode zur Fehlerbehandlung. Sie können keine Ausnahmen mit if/else-Blöcken fangen - sie teilen nichts mit try/catch.

3
Björn

In PHP mit Try Catch mit Vererbung können wir eine Ausnahme von einer anderen Klasse auslösen.

Beispiel: - Ich befinde mich in der Variablen controller und validiere Benutzerdaten mit Models.

Wenn ein Fehler ausgelöst wird, muss ich nur eine Ausnahme von Model-Methoden auslösen.

Die Ausführung in try wird abgebrochen und im Catch-Block abgefangen.

Es ist also weniger Aufwand, Bool-Werte zurückzugeben und dies zu überprüfen.

Abgesehen davon funktioniert Try Catch hervorragend bei der Verwendung in der Kette (Try - Catch in einem anderen Try - Catch). 

2
Amit Singh

Stimme @Jared Updike vollständig zu

Normalerweise erfolgt die Ausnahmebehandlung, wenn der Benutzer wenig oder nichts davon weiß. Auf der anderen Seite weiß der Benutzer des Systems, was in einem if-else-Block passiert. 

z.B. Es sollte eine "else" -Klausel sein, die einem ATM-Benutzer die Meldung "Unzureichendes Bankguthaben" zeigt, wenn sein Kontostand niedrig ist. Und diese Nachricht kann NICHT aus irgendeinem Grund in einem "catch" -Block sitzen !! 

1
Vijay Dev

Nehmen wir an, wir schreiben einen a/b-Divisionscode, und der bekannteste Ausnahmefall ist aufgetreten, d. H. 0 Divisionsfehler. Was glauben Sie, was als nächstes getan werden kann? 1. Sie können eine Nachricht drucken und beenden . 2. Sie können eine Nachricht drucken und den Benutzer die Werte usw. erneut eingeben lassen.

Es gibt Fälle, in denen verschiedene Personen/Anbieter denselben Ausnahmefall auf unterschiedliche Weise behandeln möchten. Der catch -Block lässt sie dies mit Leichtigkeit tun. Wenn Sie ändern möchten, wie ein bestimmter Ausnahmefall behandelt wird, müssen Sie nur den catch-Block ändern. 

0
xscorp7