Wozu brauchen wir den PHP-Ausnahmecode? Irgendein Anwendungsfall-Szenario?

Lesezeit: 6 Minuten

Benutzer-Avatar
Raul Prasad

Okay, es ist eine sehr lahme Frage für viele, aber ich hoffe, ich werde überwältigende Antworten bekommen 🙂

Wenn ich eine Ausnahme in PHP auslöse, kann ich der Nachricht einen Code hinzufügen.
Ich fange eine Ausnahme ab und behandle sie entsprechend ihres Typs (Like InvalidArgumentException oder OutOfBoundException). Ich logge die Botschaft oder zeigen Sie es an oder tun Sie, was auch immer geeignet ist.

Ich kann auch eine vorherige Ausnahme anhängen, um einen Pfad zum Ursprung des Fehlers zu verfolgen.

ABER eines habe ich noch nie benutzt oder an das ich nie gedacht habe: wie nützlich es ist Code?

Zum Beispiel:

throw new Exception("db Error", $code, $previousException);

Was mache ich mit $code?

  • (Irrelevant: Ich bin mir ziemlich sicher, dass “Anwendungsszenario” doppelt ist …)

    – Rudie

    3. Mai 2011 um 11:32 Uhr

  • Nur um darauf hinzuweisen, Sie haben es falsch herum verstanden. Es sollte sein: throw new Exception( "db Error", $code, $previousException );

    – Craig Sefton

    3. Mai 2011 um 11:36 Uhr

Die Nachricht wird dem Benutzer angezeigt, während der Code von Ihrem Programm verwendet wird. In Ihrem „Datenbankfehler“-Beispiel könnten Sie beispielsweise eine Reihe von Codes erstellen, wie z

  1. Verbindung nicht möglich
  2. Fehler bei Abfrage
  3. Leeres Ergebnis
  4. Fehler beim Schließen der Verbindung

und verwenden Sie dann den entsprechenden Code. Wenn dann andere Teile Ihres Codes die Ausnahme sahen, wüssten sie, was passiert ist, und könnten möglicherweise intelligent damit umgehen.

  • Was wird bevorzugt? Verwendung von Ausnahmecodes oder mehreren Ausnahmeklassen (\Exception\MySQL\ConnectionFailed, \Exception\MySQL\EmptyResultSet, etc.)? Danke! 🙂

    – Philipp Gerber

    3. Mai 2011 um 11:37 Uhr


  • @Phillipe: Es ist wirklich eine Frage der persönlichen Entscheidung, aber im Allgemeinen verwenden Sie verschiedene Klassen, wenn die Anzahl der Fälle gering ist, und verwenden Sie den Code, wenn er sehr groß ist. In diesem Datenbankbeispiel mit vier Fällen wären verschiedene Klassen in Ordnung. Aber wenn Sie an fünf andere Dinge denken, die schief gehen könnten, wäre die Verwendung von neun verschiedenen Ausnahmeklassen nur schmerzhaft, und die Verwendung des Codes allein wäre sinnvoller.

    – Ernest Friedman Hill

    3. Mai 2011 um 12:06 Uhr

  • Danke, das macht Sinn! 🙂

    – Philipp Gerber

    3. Mai 2011 um 16:38 Uhr

  • Würden Sie die Nachricht dem Benutzer wirklich zeigen? Was ist mit der Lokalisierung, wenn sie erforderlich ist? Ist es akzeptabel, lokalisierte Nachrichten in eine Ausnahme zu stellen?

    – robsch

    23. März 2015 um 13:23 Uhr

  • Sie könnten lokalisierte Nachrichten sicherlich in eine Ausnahme stecken, aber in diesem Fall ist der Code tendenziell noch sinnvoller, da der Code als i18n-Schlüssel verwendet werden kann.

    – Ernest Friedman Hill

    23. März 2015 um 15:53 ​​Uhr

Wie $code interpretiert wird, ist abhängig vom Ausnahmetyp. Wenn Sie zum Beispiel eine haben Exception Unterklasse, die einen MySQL-Datenbankfehler darstellt, dann die $code könnte der native MySQL-Fehlercode sein. Im Falle eines Low-Level-IO-Fehlers könnte dies ein Wert von sein <errno.h>.

Grundsätzlich, $code sollte alles enthalten, was Sie zum programmgesteuerten Behandeln einer Ausnahme benötigen. Die meisten Ausnahmen sollen irgendwo behandelt werden. Wenn alle Ihre Ausnahmen einfach als Fehler angezeigt werden, dann $code ist nur nützlich, wenn Sie einen Fehlercode aus einer Bibliothek wie der MySQL-Clientbibliothek einfügen müssen.

Benutzer-Avatar
Koen.

Ich habe Implementierungen (CakePHP) gesehen, wo die $code wird als HTTP-Statuscode verwendet.

Ich habe dieses Konzept mit einer Teilmenge von Ausnahmen implementiert. Also alle Ausnahmen erstrecken sich von HttpException die geworfen werden, antworten mit HTTP-Fehlern

Benutzer-Avatar
Razan Paul

In objektorientierten Sprachen vermittelt der Typ der Ausnahme, um welche Art von Fehler es sich handelt. Wenn Sie jedoch beispielsweise zwei Dinge haben, die denselben Ausnahmetyp generieren können, könnte der Fehlercode verwendet werden, um weitere Details anzugeben.

Der Fehlercode ist ein weit verbreitetes Merkmal in nicht objektorientierter Sprache, um zu vermitteln, um welche Art von Fehler es sich handelt.

Ich persönlich verwende den Code, um eine komprimierte Fehlermeldung zu erhalten, die der Benutzer an den Support senden kann. Nehmen wir zum Beispiel an, der Benutzer versucht sich zu authentifizieren, und er scheitert, mein Code löst eine aus AuthenticateException mit der Nachricht: Failed to authenticate, und ein spezifischer Code, der sich auf das eigentliche Problem hinter dem Fehler bezieht. Der Benutzer sieht nur die Authentifizierungsnachricht und den Code und weiß daher nicht, was der wahre Grund für die fehlgeschlagene Authentifizierung war. Er wird dann darauf hingewiesen, dass er sich bei Bedarf mit dem Code an das Support-Team wenden sollte.

Anhand des Ausnahmecodes können unsere Support-Kollegen leicht feststellen, was der wahre Grund für die fehlgeschlagene Authentifizierung war (ungültiges Passwort, nicht vorhandener Benutzername, Konto wurde gesperrt usw.) und dem Benutzer möglicherweise entsprechend helfen.

Bisher viele gute Antworten, aber ich bin überrascht, dass keiner auf den Kern dessen gestoßen ist, was ein Fehlercode wirklich ist.

Sie benötigen einen Fehlercode aus demselben Grund, aus dem Sie eine ID-Spalte in einer Datenbanktabelle benötigen. Es ist eine eindeutige Kennung für die genau Fehler, der passiert ist.

Der Name des Ausnahmetyps ist nicht identisch. Zum Beispiel:

  • Es kann mehrere Variationen oder Ursachen einer Ausnahme mit demselben Typ geben. Der Fehlercode gibt Ihnen möglicherweise mehr Informationen, wenn Sie ihn nachschlagen, als nur die Art des Fehlers.
  • Wenn Sie manuell einen Fehler im Code auslösen, hat es viele Vorteile, einen benutzerdefinierten Fehlercode damit übergeben zu können. Möglicherweise möchten Sie den genauen Fehler identifizieren oder im Code platzieren, ohne einen neuen Typ für jede Ausnahme in Ihrem Codebeispiel zu erstellen.
  • Wenn Sie ein Fehlerobjekt darauf überprüfen müssen, welcher Fehler aufgetreten ist, tun Sie eine einfache if ($error->code === 201) ist viel einfacher, als den Typ zu überprüfen oder Fehlermeldungszeichenfolgen zu vergleichen. Wenn Sie 201 nicht in Ihrem Code verwenden möchten, weil es den Fehler nicht übermittelt, ist es auch sehr einfach, es einer Konstanten zuzuweisen.
  • Wenn Sie Informationen über einen Fehler in einer Datenbank protokollieren möchten, ist eine eindeutige Kennung a viel einfacher in einer Datenbank zu arbeiten. Und wenn Sie es dann aus der Datenbank ziehen, um damit im Code zu arbeiten (nicht mehr in einem Ausnahmeobjekt), ist es wieder einfacher, den Fehler anhand eines Fehlercodes zu identifizieren und auf diese Weise damit zu arbeiten. Wenn Sie so etwas wie einen Klassennamen in der Datenbank speichern, was ist, wenn jemand ihn mit camelCase im Gegensatz zu PascalCase in die Datenbank einfügt oder sich an den genauen Namen falsch erinnert oder einen Tippfehler hat usw. Selbst wenn Sie eine Aufzählung verwenden, Was ist, wenn Sie eine Schnittstelle zu einer anderen Datenbank benötigen, die möglicherweise ein anderes Format verwendet?
  • Wenn Sie einem Benutzer in Ihrer Anwendung einen Fehlercode geben und er auf eine Seite mit einer Fehlerliste geht, ist es für ihn viel einfacher, den genauen Fehler mit einem Fehlercode zu finden, als Textbeschreibungen des Fehlers zu durchsuchen. Es ist auch einfacher für sie, es in einer Suchmaschine zu finden.

Grundsätzlich macht es ein globaler Fehlercode einfach, Formate zu speichern, zu referenzieren, zu übergeben, zu vergleichen, Formate zu ändern, ohne Informationen zu verlieren, Code und Daten mit anderen zu teilen, benutzerdefinierte Fehler zu erstellen usw. Die meisten Dinge, die für das Speichern von Daten in einer Datenbank mit einem eindeutigen gelten id gilt auch für das Speichern eines Fehlers mit einem Fehlercode.

1311750cookie-checkWozu brauchen wir den PHP-Ausnahmecode? Irgendein Anwendungsfall-Szenario?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy