Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP 5 Exeption Handling

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP 5 Exeption Handling

    Hi,

    Ich setze mich gerade zum ersten Mal mit dem Thema Exeption Handling auseinander. Eine Ausgabe erfolgt bereits, nun moechte ich das ganze jedoch ein wenig umbauen.
    Es handelt sich um eine Login Klasse

    Der Aufbau:

    Als erstes wird ueberprueft ob ueberhaupt ein Username und ein Passwort eingegeben wurde.
    PHP-Code:
    if($Username == ""){
     throw new 
    Exception ("Please enter a Username."); }

    if(
    $Password == ""){
     throw new 
    Exception ("Please enter a Password."); } 
    Am Ende erfolgt ein:
    PHP-Code:
    catch(Exception $e)
    {
    echo 
    'Message: ' .$e->getMessage();    

    Das ist schoen und gut, jedoch moechte ich 1. die Fehlermeldung dort nicht direkt stehen haben und 2. die Ausgabe dort nicht haben. Stattdessen moechte ich folgendes:

    PHP-Code:
    throw new Exception (Hier soll angegeben werden das es sich um fehlenden Usernamen handelt); } 

    throw new 
    Exception (Hier soll angegeben werden das es sich um fehlendes Passwort handelt); } 
    Ich habe am Ende meiner Klasse eine Methode getErrorMessage($error). Dort befinden sich alle Errormessages. Es gibt ja unterschiedliche Fehler die ich normalerweise so zuweise:

    $this->errorCodeArray[] = 1 // Waere z.B ein ungueltiger Username

    An anderer Stele greife ich dann auf die Methode getErrorMessage($error) zu und lese alle angefallenden Fehler aus.

    Gibt es nun eine Moeglichkeit die throw mit meinen Methoden zusammenzufassen? Ich habe gelesen das nach der throw kein weiter Code ausgefuehrt wird, ich koennte also nie beide Meldungen bekommen?

    Ich hoffe ich habe meine Problem verstaendlich beschrieben und wuerde mich ueber jede Anregung freuen.

    Vielen Dank im Voraus.


    Gruss Luka

  • #2
    Du erstellst 2 Klassen und erbst von Exception und wirfst diese dann.

    Beispiel:
    PHP-Code:
    class EmptyUsernameException extends Exception {}
    class 
    EmptyPasswordException extends Exception {}

    try {
    if(
    $Username == ""){
     throw new 
    EmptyUsernameException(); }

    if(
    $Password == ""){
     throw new 
    EmptyPasswordException(); } 

    } catch (
    EmptyUsernameException $e)
    {
        echo 
    "Please enter a Username.";
    } catch (
    EmptyPasswordException $e)
    {
        echo 
    "Please enter a Password.";

    Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

    Kommentar


    • #3
      Hi,

      Danke fuer die Antwort. Gibt es wirklich keine andere Moeglichkeit als 2 weitere Klassen zu erstellen. Das klingt fuer meine Geschichte zu uebertrieben.

      Alles was ich ja erreichen moechte ist das alle Errormessages ja in einer Methode stehen, das waere so ja nicht gegeben, sondern nun waeren es auch noch in 2 Klassen ausserhalb meiner jetzigen Klasse.

      Es muss doch eine andere Loesung geben, oder?

      Kommentar


      • #4
        Du wirfst exception-handling und validierung durcheinander.
        Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

        Kommentar


        • #5
          Du könntest mit Error-Codes und Konstanten arbeiten:

          PHP-Code:
          class UserException extends Exception {
              const 
          EMPTY_USERNAME 1;
              const 
          EMPTY_PASSWORD 2;
          }

          try {
          if(
          $Username == ""){
           throw new 
          UserException('User hat leeren Benutzernamen angegeben'UserException::EMPTY_USERNAME); }

          if(
          $Password == ""){
           throw new 
          UserException('User hat leeres Passworrt angegeben'UserException::EMPTY_PASSWORD 

          } catch (
          UserException $e) {
             
          // identifizierung über den errorCode [ $e->getCode() ]
             
             

          [URL="http://www.robo47.net"]robo47.net[/URL] - Blog, Codeschnipsel und mehr
          | :arrow: [URL="http://www.robo47.net/blog/192-Caching-Libraries-and-Opcode-Caches-in-php-An-Overview"]Caching-Klassen und Opcode Caches in php[/URL] | :arrow: [URL="http://www.robo47.net/components"]Robo47 Components - PHP Library extending Zend Framework[/URL]

          Kommentar


          • #6
            Hi,

            also so ganz kann ich das noch nicht nachvollziehen.

            Ich habe ja meine

            PHP-Code:
            function getErrorMessage($code)
            {
            $error[1] = "The Username is invalid. Please use only alphanumeric values.";
            $error[2] = "The Username could not be found in the Database";
            $error[3] = "The Password is invalid. Please use only alphanumeric values.";
            $error[4] = "The Password is incorrect."
            }

            Ich habe eine Methode die Validierungen vornimmt und eine Methode die den Eintrag mit der DB prueft. Wenn ein Fehler aufgetaucht ist wird dem ErrorArray die Nummer uebergeben und am Ende mit einer Foreach alle Error Messages ausgelesen.
            z.B $this->errorCodeArray[] = 2; // Username not in DB

            Nun soll halt einfach statt der direkten Ausgabe throw new UserException('User hat leeren Benutzernamen angegeben') eine Errornummer dem errorCodeArray uebergeben werden. ich moechte jedoch keine neue Klasse erstellen, denn was soll das direkt bringen? Dann habe ich meine Fehlermeldungen ja nicht nur in 1 Datei verstreut, sondern vielmehr in 2 oder 3 Dateien/Klassen.

            Ich haette gerne alles in einer Methode, einmal wegen der Uebersicht und dareuberhinaus wegen der Moeglichkeit auch mit Mehrsprachigkeit zu arbeiten.

            Irgendwas muss ich aber wohl noch nicht komplett verstanden haben.

            Kommentar


            • #7
              Bastel Dir doch nen Exception Handler mit einer Fabrikmethode:

              PHP-Code:
              class ExceptionHandler {
                static function 
              create ($code $language)
                  {
                  switch (
              $code)
                     {
                     case 
              EMPTY_PASSWORD:
                       return new ... (...);
                     }
                  }

              Trotzdem würde ich mit mehreren Ableitungen arbeiten, verschiedene Sprachen kannst Dui so erst recht gut implementieren.
              [COLOR="#F5F5FF"]--[/COLOR]
              [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
              [COLOR="#F5F5FF"]
              --[/COLOR]

              Kommentar


              • #8
                Das was du machen willst macht auch keinen wirklichen Sinn. Wie schonmal gesagt wurde: Du wirfst Error-Handling und Validierung durcheinander.

                Exceptions sind Ausnahmefehler! Ausnahmefehler heißen: Aua, das tat weh, jez hör ich auf zu arbeiten! Nach einem Ausnahmefehler SOLL es nichtmehr weitergehen, weil das ein so schwerwiegender Fehler ist das nicht mehr weitergemacht werden soll.

                Validierung ist das was du machst, z.b. Eingaben überprüfen. Für Validierungen sind Exceptions aber nicht geeignet, dazu solltest du dann tatsächlich statt "throw new Exception ..." einfach sowas machen wie "$errors[] = 'Username falsch';" und dann am ende eben $errors durchgehen. Exceptions sind dazu nicht gedacht ;-9

                mfg

                PS: Der Unterschied ist ungefähr so wie Warnungen und Fehler von PHP. Nach einem FEHLER gehts nicht mehr weiter, Warnungen heißen nur "hier ist was nicht ganz in ordnung"

                Kommentar


                • #9
                  Stimmt. Da habe ich gar nicht drauf geachtet.
                  [COLOR="#F5F5FF"]--[/COLOR]
                  [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                  [COLOR="#F5F5FF"]
                  --[/COLOR]

                  Kommentar


                  • #10
                    Zitat von BlackWolf Beitrag anzeigen
                    Nach einem Ausnahmefehler SOLL es nichtmehr weitergehen, weil das ein so schwerwiegender Fehler ist das nicht mehr weitergemacht werden soll.
                    Das ist nicht ganz richtig. Wenn es (nur) für schwerwiegende Fehler benutzt werden sollte, dann hätte man es FatalError genannt und nicht Exception
                    Aber Du willst (in der Regel) einen Zustand in einem anderen Kontext signalisieren, damit Du da, wo es weh tut, reagieren kannst. Also in einer idealen Welt: Regelfall runterprogrammieren, Ausnahmen kontextabhängig behandeln.
                    Um mal bei dem Beispiel zu bleiben (auch wenn ich es nicht für ein sonderlich gutes Beispiel halte).
                    if($Username == ""){
                    Vergleich auf leere Zeichenkette -> true tut nicht weh. Aber semantisch und in einem darüber liegenden Kontext ist der fehlende Benutzername etwas, dass den Regelfall unterbricht. Das stört die Vergleichsfunktion nicht, das stört eventuell die gesamte Validierungsmethode nicht, aber die Login-Methode stört es dann irgendwann.
                    Und damit sind wir schon bei den beiden (größeren) Problemen, die ich bei dem Beispiel sehe.
                    a) Was ist, wenn Benutzername und Passwort nicht angegeben wurden. U.a. Thema Usability.
                    b) dammit, vergessen. Bin total verschnupft. Aber das war eigentlich der größere Knackpunkt.... Sollte ich noch mal drauf kommen, reiche ich es nach

                    edit: und ich tippe auch langsam. Krank==Mist.

                    Kommentar


                    • #11
                      Hi,

                      jetzt beschaeftige ich mich schon seit Stunden mit dem Thema und bevor ich die letzen Antworten hier gelesen habe, kam mir bereits der Gedanke ob ich überhaupt mit Exception arbeiten sollte. Sieht vielleicht gut aus, aber erfüllt es wirklich den Zweck...

                      Wenn ich es nun also richtig verstehe, dann könnte ich exceptions einsetzen wenn ich einen Fileupload anbiete, aber z.B ein Ordner zum hochladen nicht vorhanden ist oder ein Bild das gelöscht werden soll nicht mehr vorhanden ist.

                      Formulareingaben sollte ich dann wohl doch anders prüfen, wobei ich nun überlegt habe ob es nicht sogar besser wäre alle möglichen Fehlermeldungen in einer Datei zu hinterlegen. Also Fehlermeldungen bei einer Registrierung, beim Einloggen etc. Nur kommt mir dann in den Sinn, wie greife ich in meinen unterschiedlichen Klassen auf diese Datei zu?

                      Würde das Sinn machen oder sollten die einzelnen Fehler doch in der jeweiligen Klasse bleiben?

                      Kommentar


                      • #12
                        Zitat von Luka Beitrag anzeigen
                        Hi,

                        jetzt beschaeftige ich mich schon seit Stunden mit dem Thema und bevor ich die letzen Antworten hier gelesen habe, kam mir bereits der Gedanke ob ich überhaupt mit Exception arbeiten sollte. Sieht vielleicht gut aus, aber erfüllt es wirklich den Zweck...

                        Wenn ich es nun also richtig verstehe, dann könnte ich exceptions einsetzen wenn ich einen Fileupload anbiete, aber z.B ein Ordner zum hochladen nicht vorhanden ist oder ein Bild das gelöscht werden soll nicht mehr vorhanden ist.

                        Formulareingaben sollte ich dann wohl doch anders prüfen, wobei ich nun überlegt habe ob es nicht sogar besser wäre alle möglichen Fehlermeldungen in einer Datei zu hinterlegen. Also Fehlermeldungen bei einer Registrierung, beim Einloggen etc. Nur kommt mir dann in den Sinn, wie greife ich in meinen unterschiedlichen Klassen auf diese Datei zu?

                        Würde das Sinn machen oder sollten die einzelnen Fehler doch in der jeweiligen Klasse bleiben?
                        Naja ob das Sinn macht kommt sicher auf Aufbau und Größe des Projekts an.
                        Aber zum Thema Zugriff. Du kannst z.b. eine Klasse dafür baun. Sowas wie

                        class Muh {
                        const Fehler1 = 'eek';
                        const Fehler2 = 'muh';
                        }

                        dann kannste von überall drauf zugreifen mit Muh::Fehler1 und Muh::Fehler2

                        mfg

                        Kommentar

                        Lädt...
                        X