Heim >Backend-Entwicklung >PHP-Tutorial >PHP Master | Außergewöhnliche Ausnahmen
Kernpunkte
Exception
übereinstimmt zu sagen, dass es ein "Problem" gibt, und der Code hat keine Ahnung, was los ist. Stattdessen sollte immer eine benutzerdefinierte Ausnahme geworfen werden, um den Anrufcode über die aktuelle Situation zu informieren, wodurch eine feinkörnige Kontrolle über das geschieht, was geschieht. Php 5 führt einen Ausnahmebehandlungsmechanismus ein, eine spezielle Klasse, die (im Gegensatz zu geworfenen Fehlern) geworfen und gefangen werden kann, um unerwartete Ereignisse anzuzeigen. Im Gegensatz zu Fehlern sollen Ausnahmen von dem aufrufenden Code und dem Aufruf nach oben der Ausführungskette nach oben verarbeitet werden, bis sie gefangen werden. Sobald eine Ausnahme ausgeliefert ist, wird der Code im aktuellen Bereich nicht mehr ausgeführt (so wird keine Zeile nach der Ausführung der throw
-Antage Ausnahmebehandler von der Sprache). Die Codeausführung wird nur dann fortgesetzt, wenn die Ausnahme gefangen wird. Dieser Artikel soll keine Ausnahmen auf der Einstiegsebene erläutern, sondern einige Ratschläge zur besseren Nutzung von Ausnahmen geben. Wenn Sie noch nie Ausnahmen verwendet haben, müssen Sie möglicherweise das PHP-Handbuch konsultieren oder das von meinen Freunden geschriebene Buch "PHP Master: Writing Speopded Code" lesen, das hervorragend erklärt
Fehler ist keine Ausnahme
Sie haben vielleicht über Ausnahmen erfahren, aber Sie wundern sich vielleicht über den Unterschied zwischen einem PHP -Fehler und einer (benutzerdefinierten) Ausnahme. Die Logik ist eigentlich sehr einfach: Der Fehler ist nicht einverwirkbar, tritt in der Hauptausführungsschleife auf und zeigt die Stabilität der Umgebung an. Wenn Sie beispielsweise versuchen, auf den skalaren Wert als Array zuzugreifen und E_NOTICE
zu erhöhen, bedeutet dies ein Problem mit Ihrem Code. Es gibt keine Garantie dafür, dass die fortgesetzte Ausführung sicher ist. Diese Bedingung kann während der Ausführung nicht korrigiert werden. Wenn der T_IF
durch ein unerwartetes E_PARSE
vom Parser entdeckt wird, werden Sie verstehen, wie sich dies auf die Stabilität von Dingen auswirkt. Andererseits sind Ausnahmen wiederherstellbar, können (und normalerweise) außerhalb der Hauptausführungsschleife auftreten und geben die Stabilität des Systems nicht an. Es ist eine Komponente, die sagt: "Ich kann Ihre Anfrage mit der angegebenen Eingabe nicht ausfüllen, damit Sie diese Informationen nach Belieben verarbeiten können." Daher kann die angegebene Anweisung mit dem aktuellen Wert nicht fertiggestellt werden. Dies bedeutet nicht, dass Ihre Umgebung instabil ist, sondern nur, dass Ihr Code die Länge des Werts durch Polstant oder Abschneiden anpassen muss. Ihr Code kann diese Ausnahme erfassen, den Wert aktualisieren und erneut versuchen. LengthException
Nicht alle Ausnahmen sind Ausnahmen
Dies ist eine der schwierigsten Fragen zu beantworten: Was genau muss eine Ausnahme ausgelöst werden? Natürlich muss Ihre Ausnahme drei Regeln im vorherigen Absatz einhalten. Ausnahmen zu werfen, wenn es auf eine beschädigte Erinnerung stoße, ist eine sehr schlechte Praxis. Ihr Code sollte stattdessen einen Fehler werfen, damit PHP so schnell wie möglich abbrechen kann, da sich die Umgebung als unsicher erweist, um die Ausführung fortzusetzen. Selbst wenn Fehler nicht erforderlich sind, ist für alle nicht erfolgreichen Situationen keine Ausnahme erforderlich. Das heißt: Nicht alle erfolglosen Situationen sind Ausnahmen. Das Wort "abnormal" bezieht sich auf eine Aktion, die kein normaler Betrieb oder Standard ist, und auf eine Abnormalität, die von normalen und erwarteten Situationen abweicht. Ein ehemaliger Kollege sagte mir einmal beim Abendessen, dass der XML/RPC-Service, das ihr Unternehmen verwendet, das Rückgrat aller öffentlichen Operationen. Der Architekt lernte dann von Ausnahmen und ihrer Bequemlichkeit bei der Angabe von nicht erfolgreichen Zuständen. Diese Säule bietet zusätzlich zu anderen Funktionen einzelne Sign-On-Funktionen. Anstatt direkt auf die Datenbank zugreifen zu können, quer wird der XML/RPC -Dienst an, der dann basierend auf dem zentralen Datenspeicher reagiert, der alle Webanwendungen bedient. Wenn gültige Anmeldeinformationen bereitgestellt werden, wird ein erfolgreicher Status zurückgegeben. Wenn ein Problem auftritt, wird eine Ausnahme geworfen und eine Nachricht angezeigt, die den Grund für den Fehler angibt. Einfach zu erfassen, können Sie die Nachricht dem Benutzer mit einer auffälligen, glänzenden Fehlermeldung anzeigen. Aber stellt der Benutzer einen falschen Benutzernamen und/oder ein Passwort, das wirklich von den Erwartungen abweicht? In meinem Projekt sind die Benutzer, die ich bewältige, nicht perfekt, sie werden Dinge typo oder vergessen. Das Erhalten falscher Anmeldeinformationen ist sehr häufig, noch häufiger als gültige Anmeldeinformationen. Überprüfungsnachweise sind das erwartete Verhalten der Anmeldung im System. In diesem Fall sollte der XML/RPC -Dienst einen Status zurückgeben, der angibt, ob die Überprüfung erfolgreich ist oder nicht. Obwohl die Anmeldeinformationen scheitern, wird der Überprüfungsprozess selbst immer noch erfolgreich ausgeführt. Wenn der Überprüfungsprozess nicht korrekt ausgeführt wird, gibt es andere Probleme. Vielleicht ist der Datenspeicher unzugänglich oder etwas anderes. Es ist sehr ungewöhnlich, dass Anmeldesysteme keine Verbindung zu ihrem Datenspeicher herstellen können, da es nicht ohne Datenspeicher ausgeführt werden kann. Dies erfordert daher eine Ausnahme. Hinweis: Einige Personen können argumentieren, dass das Anmeldesystem keine Verbindung zum Datenspeicher herstellt, dass die Umgebung instabil ist und daher einen Fehler aufnehmen sollte. Die Anmeldung im System ist jedoch nicht für die Erhöhung eines Fehlers für die Datenspeicherung verantwortlich. Wenn der Datenspeicheranschluss/Wrapper für notwendig hält, sollte ein Fehler erhöht werden. Im Allgemeinen können Sie sich Ausnahmen als Situationen vorstellen, in denen Entwickler einsteigen, sehen und umgehen müssen. Der Code, der mit dem Ausnahme -Szenario auftritt, kann dies nicht alleine tun. Dies ist wahrscheinlich, dass der Entwickler den Code und die Art und Weise, wie er damit umgeht, geschaut hat, es zulassen, wenn es passiert. Senden Sie nicht alle Ausnahmen an das Netzwerkbetriebszentrum. Griff, was Sie können und sollten, und die Ausnahme wird nur ausgelöst, wenn sie die Ausführung wirklich nicht fortsetzen kann.
"Problem"
Vor ein paar Jahren, als ich durch Europa wanderte, bin ich auf einen unvergesslichen Anblick an einem Bahnhof in Griechenland gestoßen. Einer der Schließfachbereiche sah aus, als würde eine Bombe explodieren, mit Türen auf dem Boden verstreut, halb an Scharnieren hängen oder zerschlagen. Ich erfuhr später, dass sie den Schließfachbereich entfernt haben, aber es ist erwähnenswert, wie sie dem Kunden mitgeteilt haben, dass dieser Bereich deaktiviert wurde. Es gab viel Klebeband im mittleren Teil, wobei ein Stück Papier es mit den Worten "Problem" einfügt. Technisch ist dies völlig korrekt. Mit dem Schließfach stimmte offensichtlich etwas nicht und die Situation wurde behandelt, indem es dem Kunden mitgeteilt wurde. Sie werden es vielleicht interessant finden, aber tatsächlich sehen Sie dies oft in Ihrem Code. Wenn Sie nur Exception
werfen, sagen Sie im Grunde "Problem" und der Code hat keine Ahnung, was los ist. Obwohl Exception
die Basisklasse für jede Ausnahme ist, können Sie sie mit Ihrem eigenen Typ erweitern. Eine breitere Sammlung von Ausnahmen findet sich in der SPL -Bibliothek, aber dies ist weit entfernt von der Grenze. Wenn Sie sich wichtige PHP -Frameworks wie Zend Framework oder Symfony ansehen, werden Sie feststellen, dass sie für fast alle unterschiedlichen Situationen benutzerdefinierte Ausnahmen verwenden. Es ist ein wenig umständlich, all diese Dateien zu schreiben, damit sie dynamisch geladen und alle verschiedenen Typen beibehalten werden können. Dies bietet jedoch eine feinkörnige Kontrolle darüber, was für das Framework und die Verbraucher dieses Frameworks geschieht. Wenn Sie nur Exception
werfen, können Sie nur sicher sein, dass etwas nicht stimmt und Sie genauso gut aufgeben können. Dies bedeutet, dass Sie Ausnahmen so verwenden, wie sie Fehler sind, die Erfassungsblöcke als stille Operatoren verwenden und nur die Hoffnung aufgeben, dass jemand diese Situation auf irgendeine Weise korrigieren kann.
Global Capture
Wenn es eine schlechte Idee ist, nicht-kundenspezifische Ausnahmen zu verwenden und alle möglichen Ausnahmen zu fangen, warum erlaubt die Sprache dann überhaupt? Es gibt eine Ausnahme von der Regel, die immer eine bestimmte Ausnahme verwendet und fängt, dh die globale Capture -Regel. Ein globaler Capture -Block ist der Aufnahmeblock auf höchster Ebene und muss alle Ausnahmen erfassen, die auf diese Ebene sprudeln. PHP selbst enthält eine (haben Sie die "tödliche Fehler: Unbefugte Ausnahme in ..." gesehen?), Aber Sie können ihn mit einem benutzerdefinierten Handler überschreiben, um als Fallback zu dienen. Sie können diesen Handler mit der Funktion set_exception_handler()
festlegen, damit Sie ihn so machen können, wie Sie möchten, und Ihrem PHPMD -Regelsatz eine Regel hinzufügen, die Zeilen wie "catch (Exception $e) {
" verbietet. Dies ist der einzige Grund für einen allgemeinen Ausnahmebehandler, der im Produktionscode gefunden werden sollte, der jede Instanz der Exception
-Klasse erfasst, die noch nicht gefangen wurde. Andere Handler müssen spezifisch sein und auf Ausnahmen beschränkt sein, die es weiß, wie man umgeht und verantwortlich ist. Hier vorsichtig zu sein, eine handtriebbare Ausnahme einmal sprudeln zu lassen (und dann in Code zu reparieren), ist definitiv viel besser, als zu viel zu fangen und als stiller Operator zu fungieren.
Zusammenfassung
Kurz gesagt, eine Ausnahme wird nur ausgelöst, wenn Ihr Code die angeforderte Anweisung mit der angegebenen Eingabe nicht ausfüllen kann, und stellt immer eine benutzerdefinierte Ausnahme aus Fang nur Ausnahmen, die Sie verarbeiten können und sollten. Dies macht Ihre Komponenten weniger wie schwarze Kästchen (benutzerdefinierte Ausnahmen) und verringert die Möglichkeit, dass Entwickler, die Ihre Komponenten integrieren, Ihren Code ändern müssen (keine Ausnahmen fangen, die Sie nicht sollten). Wir sagen unseren Kunden/Managern immer spezifisch, aber wir sollten auch spezifisch sein!
(Bild aus Fotolien)
Häufig gestellte Fragen zum Umgang mit PHP -Ausnahme
Ja, Sie können die Ausnahme in PHP wiederwägen. Dies ist sehr nützlich, wenn Sie irgendwie mit Ausnahmen umgehen möchten, aber ein höheres Maß an Ausnahme -Handler aufnehmen möchten. Um die Ausnahme wiederzuwischen, verwenden Sie einfach die Wurfanweisung im Fangblock.
In PHP können Sie Ausnahmen protokollieren, indem Sie die Funktion der Fehler_log im Catch -Block verwenden. Auf diese Weise können Sie Informationen über die Ausnahme, einschließlich ihrer Nachrichten und Stapelspuren, in die angegebene Protokolldatei protokollieren.
pdoException ist eine Ausnahme, die ausgeworfen wird, wenn ein Fehler in einer PDO -Operation auftritt. PDO (PHP -Datenobjekt) ist eine Datenbankabstraktionsschicht, die eine konsistente Schnittstelle zum Zugriff auf Datenbanken in PHP bietet. PDOException bietet Informationen zu Fehlern, einschließlich SQLState -Fehlercodes und Fehlermeldungen für den Datenbanktreiber.
In PHP können Sie unbekannte Ausnahmen verarbeiten, indem Sie eine benutzerdefinierte Ausnahmebehandlerfunktion definieren und dann als Standard -Ausnahmebehandler mithilfe der Funktion set_Exception_handler einstellen. Diese Funktion wird aufgerufen, wenn eine Ausnahme, die nicht vom Try-Catch-Block erwischt wird, geworfen wird.
Das obige ist der detaillierte Inhalt vonPHP Master | Außergewöhnliche Ausnahmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!