Verwendung von Exceptions

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

  • Verwendung von Exceptions

    Ich programmiere gerade an einigen Klassen zur Verwaltung von Daten aus Textdateien. Dabei gibt es zwei Hauptklassen: EntityManager und Entity. EntityManager übernimmt die Aufgaben zum Laden, Speichern und Verwalten aller Datensätze. Genauso speichert EntityManager alle Informationen, welche Eigenschaften die entsprechende Klasse Entity gerade besitzt. Entity steht für genau einen Datensatz und erlaubt im Wesentlichen diese Daten per Entity::get($name) bzw. Entity::set($name, $value) zu verwalten.

    Dabei greift die Klasse Entity auf die Informationen von EntityManager zurück um die Daten entsprechend zu filtern. Dabei wird auch geprüft ob es die Eigenschaft mit dem Namen $name überhaupt vorhanden ist. Ist dies nicht der Fall, wird von EntityManager eine Exception geworfen. Das alles erst einmal als Grundlage meiner Frage.

    Jetzt ist es für mich die Frage, ob Entity diese Exception nur fangen soll und dann nur einen leeren Wert zurück geben oder garnichts ausführen soll, oder ob es besser ist die Excpetion weiterzuleiten und bei dem Zugriff auf die Entity als Objekt die Excpetion zu fangen und zu bearbeiten. Was ist eurer Meinung nach in diesem Fall sinnvoll?

  • #2
    ich hatte früher mal den denkfehler dass ich ne excepten in einer methode fangen und zurückgeben muss:

    PHP-Code:
    <?php

    class foo {

      static function 
    bar() {

        try {
          throw new 
    Exception('nothing');
        } catch (
    Exception $e) {
          return 
    $e;
        }

      }

    }

    $erg foo::bar();
    if (
    $erg instanceof Exception)
      die (
    $erg->getMessage());

    ?>
    funktioniert zwar, ist aber blödsinn, da man dann erst wieder prüfen muss ob der zurückgegebene wert eine exception ist ..

    PHP-Code:
    <?php

    class foo {

      static function 
    bar() {

        try {
          throw new 
    Exception('nothing');
        }

      }

    }

    try {
      
    $erg foo::bar();
    } catch (
    Exception $e) {
      die (
    $e->getMessage());
    }

    ?>
    .. das tut sein übriges

    ob man throw auch ausserhalb eines try-blocks verwenden kann hab ich noch nicht probiert .. wär aber vernünftiger, also denkbar ..

    ich hoffe das meintest du und ich hab zur lösung beigetragen
    mfg,
    [color=#0080c0]Coragon[/color]

    Kommentar


    • #3
      .. das tut sein übriges

      ob man throw auch ausserhalb eines try-blocks verwenden kann hab ich noch nicht probiert .. wär aber vernünftiger, also denkbar ..

      ich hoffe das meintest du und ich hab zur lösung beigetragen
      Naja, wie man Exception generell verwendet weiß ich schon. Es ging hier eher um die praktische Anwendung, bei dem Fall, dass eine Hilfsmethode eine Exception wirft und wie sie von der eigentlichen Methode verarbeitet werden soll. Ich habe mich in diesen Fall entschieden die Excpetion lieber nur intern zu behandeln, da es sonst recht komplex wäre sie jedes Mal zu fangen. Dies entspricht aber nicht umbedingt die Absicht in den Beispiel.

      Kommentar


      • #4
        naja .. wo setz ich an ?

        angenommen du findest irgendwo eine umfangreiche(!!) klasse die wie für dich gemacht ist ..

        du baust sie ein - schön und gut

        jetzt kanns aber durch eine falsche benutzung vom webseiten besucher vorkommen dass die klasse nicht korrekt arbeitet - was macht die klasse ?
        sie spuckt potthässliche fehlermeldungen aus, die ganz oben im explorerfenster picken und noch dazu in der sprache des benutzers (hindu) verfasst ist - wer weiß damit was anzufangen ?

        exception können - richtig angewandt - solche probleme lösen, die klasse wirft einfach mit solchen dingern um sich und du fängst sie in deinem skript, wo du mit den fehlern machen kannst was du willst (ignorieren zB )

        richtig angewandt mit errorcodes (auf die du ja dann zugriff hast) und ner doku welche codes in der klasse vorkommen können mit beschreibung denk ich sind exceptions gut verwendbar

        ps. obiges issn krasses beispiel, normalerweise programmiert eh jeder in englisch - ich kenne trotzdem ausnahmen

        hab ich jetzt geholfen, oder zumindest licht ins dunkel gebracht ?
        EDIT:
        oh, vergessen *lichtschalter betätig*
        mfg,
        [color=#0080c0]Coragon[/color]

        Kommentar


        • #5
          Ich hoffe, dass du mich nicht falsch verstehst. Allgemein finde ich Exceptions eine gute Sache und finde es auch gut, wenn eine Methode eine wirft um den Fehler zu behandeln. Nur die Frage ist bis zu welchen Fehlergrad eine Exception geworfen werden soll - bzw. es nützlich ist. Wenn eine Datei nicht lesbar ist, finde ich eine Exception voll ok. Bei mir ist es aber bei dem angesprochenen Beispiel so, dass es - verglichen mit PHP's Error Level - lediglich eine Notizmeldung wäre.

          Um es besser zu verstehen, ein Teil des betroffenen Codes (nicht wundern, dass try/catch hier Funktionen sind und die Klasse mehr Attribute hat. Es handelt sich hierbei ein Pseudoimplementierung für PHP 4):

          EntityManager::getDefaultValue()
          PHP-Code:
          /**
               * get defined default value
               *
               * @return mixed
               * @access public
               * @param string $name
               * @param mixed $value
               * @throws EntityManager.PropertyNotExists
              */
              
          function getDefaultValue($name)
              {
                  if(
          $this->hasProperty($name))
                  {
                      if(isset(
          $this->definition[$name]['generate'])) {
                          
          $method $this->definition[$name]['generate'];
                          
                          if(
          method_exists($this$method)) {
                              return 
          $this->$method();
                          }
                          
                          return 
          null;
                      }
                      elseif(isset(
          $this->definition[$name]['default'])) {
                          return 
          $this->definition[$name]['default'];
                      }
                      
                      return 
          null;
                  }
                  
                  throw(new 
          Exception(
                      
          'EntityManager.PropertyNotExists',
                      
          sprintf("Property '%s' is not defined in entitymanager '%s'",
                          
          $nameget_class($this)),
                      
          __FILE____LINE__
                      
          )
                  );
              } 
          Entity::get()
          PHP-Code:
          /**
               * get property of entity
               *
               * @access public
               * @return mixed
               * @param string $name
               * @throws EntityManager.PropertyNotExists
              */
              
          function get($name)
              {
                  if(isset(
          $this->properties[$name])) {
                      return 
          $this->manager->prepareValueGet($name$this->properties[$name]);
                  }
                  
                  {
          //try
                      
          $value $this->manager->getDefaultValue($name);
                  }
                  if(catch(
          'Exception'$e)) {
                      
          // Um dieses throw geht es hier
                      // throw($e);
                      
          return null;
                  }
                  
                  return 
          $value;
              } 

          Kommentar


          • #6
            du willst die exception weiter werfen ? kannst du ruhig machen

            du kannst auch dort den fehler ausgeben - wenn du allerdings die klasse andren zur verfügung stellen willst, dann werden sie die exceptions ganz oben - index.php, oder was auch immer - verarbeiten wollen

            der vorteil - zumindest einer - liegt doch darin dass du nicht in den ganzen dateien einer speziellen klasse rumkramen musst nur um die fehleranzeige anzupassen

            na hoff ich mal dass ich dich nun verstanden hab
            mfg,
            [color=#0080c0]Coragon[/color]

            Kommentar


            • #7
              du hast die klassen A, B und C

              im skript verwendest du ein objekt von A, das wiederum B verwendet und das wiederum verwendet C

              wenn in C ein fehler auftritt, den C behandeln kann, dann sollte C das tun
              wenn ncicht, wird die exception nach oben weitergereicht
              kann B damit auch nix anfangen, dann geht die exception zu A und wenn auch A nichts damit anfangen kann, dann hast du die exception direkt in deinem skript


              ich dachte, so in etwa sollte das ablaufen?

              Kommentar


              • #8
                wenn B den fehler behandeln kann, warum nicht ..
                aber woher sollte B (von xy programmiert) wissen wie der programmierer von A (nennen wir ihn mal yz) auf bestimmte eingabefehler des endbenutzers, die dann in C zu fehlern führern, reagieren soll ?
                mfg,
                [color=#0080c0]Coragon[/color]

                Kommentar

                Lädt...
                X