soll ich eine Ausnahme vom Konstruktor auslösen?

46

Ich weiß, dass ich in PHP eine Ausnahme vom Konstruktor auslösen kann, aber sollte ich das tun? Zum Beispiel, wenn der Wert eines Parameters nicht dem entspricht, den ich erwartet habe.

Oder sollte ich es verschieben, eine Ausnahme auszulösen, bis eine Methode aufgerufen wird? Was sind in beiden Fällen Vor- und Nachteile?

WordsWorth
quelle
Die Frage ist, ob Ihre Benutzer hässliche Ausnahmefehlermeldungen erhalten sollen.
15
@LawrenceCherone nein, das ist nicht die frage. Überhaupt nicht. Die Frage ist, ob eine Ausnahme sofort ausgelöst werden soll, wenn der ctor das Objekt aus den an ihn übergebenen Argumenten nicht in einen gültigen Zustand versetzen kann, oder ob dies verzögert werden soll, bis eine Methode aufgerufen wird, die in dieser Instanz mit einem möglicherweise ungültigen Zustand arbeitet. Besser geeignet für Programmierer.
4
@LawrenceCherone Du hast recht. Keine Software sollte jemals absichtlich ausfallen. es sollte einfach weitermachen und schauen, was passiert. / s
user253751
@immibis Guter Sarkasmus ist gut.
Kodeart
Das ist eine tolle Frage !!! Ich habe diese Idee bis heute nicht einmal in Betracht gezogen.
Rhys Johns

Antworten:

75

Warum würdest du es verschieben, die Ausnahme zu werfen?

Wenn Sie wissen, dass das Objekt mit den angegebenen Parametern nicht ordnungsgemäß instanziiert werden kann, sollten Sie auf jeden Fall eine Ausnahme auslösen.

Andernfalls könnte jemand Ihr Objekt auf null testen, was nicht der Fall ist, und davon ausgehen, dass alles wie erwartet verlaufen ist.

Es gibt eine Menge Dinge, die Sie mit Ihrem Objekt tun können, ohne eine Methode aufzurufen: Es könnte zu einer Liste hinzugefügt, verglichen, als Parameter gesendet werden usw. usw. All dies sind Dinge das hätte nicht passieren dürfen, da es kein gültiges Objekt ist.

Andrei G
quelle
21

Wenn Ihr Konstruktor mit ungültigen Parametern aufgerufen wird, sollten Sie (müssen?) Eine Ausnahme auslösen. Wenn Sie dies nicht tun, erhalten Sie möglicherweise ein fehlerhaftes Objekt, das sich nicht wie erwartet verhält.

Félix Gagnon-Grenier
quelle
17

Absolut!!

Sie sollten die Ausnahme auslösen, wenn die Parameter zum Erstellen des Objekts ungültig oder nicht vertragsgemäß sind. Es ist keine gute Idee, mit dem Ablauf fortzufahren, wenn Sie wissen, dass das Objekt mit schlechten Daten erstellt wurde, was viele Probleme verursachen kann , wenn Sie dem Aufrufer erlauben, fortzufahren.

Es ist immer besser, "SCHNELL SCHLAGEN UND FRÜH SCHLAGEN"

java_mouse
quelle
7

Ich weiß, dass ich in PHP eine Ausnahme vom Konstruktor auslösen kann, aber sollte ich das tun?

Dies ist der einzig vernünftige Weg, um darüber zu informieren, dass die Objektkonstruktion fehlgeschlagen ist.

BЈовић
quelle
2

Warum sollten Sie den Parametersatz nicht validieren, bevor Sie Ihr Objekt instanziieren? Dies würde sicherstellen, dass Ihr Objekt erstellt wird, und somit alle Nebeneffekte entfernen, die bei dessen Ausfall auftreten können.

Obwohl ich weiß, dass Sie die Dinge in Ihrem Konstruktor überprüfen und Ausnahmen werfen können, ziehe ich es vor, meine Konstruktoren so zu schreiben, dass sie nicht fehlschlagen. Ich führe eine Parameterüberprüfung durch, bevor ich Objekte instanziiere, die ich dann ausnehmen kann, ohne dass meine Konstruktoren versagen. Außerdem versuche ich im Allgemeinen nicht, neue Objekte in meinen Konstruktoren zu instanziieren, sondern sie nach Bedarf zu instanziieren.

Nur meine Meinung. PHP bietet viel Freiheit - viel Spaß!

Tony Mays
quelle
Ich bin nicht sicher, warum diese Antwort abgelehnt wird. Es bietet einen gültigen Ansatz unter Verwendung der Parameterüberprüfung vor der Objektkonstruktion ( eine "Guard" -Methode ), mit der Sie Ihre Klassen / Funktionen für bestimmte (normalerweise geschäftliche) Regeln entwerfen können. Wenn auch nicht direkt die Frage des OP beantwortet, aber es ist immer noch ein guter Rat :)
Kodeart