[OOP] Exception: undefined Method?

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

  • [OOP] Exception: undefined Method?

    Hallo meine liebgewonnenen PHP-Freaks.

    Nachdem ich mich langsam aber sicher an OOP und PHP5 gewöhnen will, bin ich auf das äußerst interessante Theme des Exception-Handlings gestoßen.

    Da ich auch in meiner neuesten Errungenschaft, dem Buch "Professionelle PHP-Techniken" auch schon über das Thema gestolpert bin, habe ich beschlossen, mich ein wenig intensiver damit auseinander zu setzen.

    Ich habe als eine kleine Datei /lib/lib.errorHandler.php gemacht, die folgende Klasse enthält:

    PHP-Code:
      /** [errorHandler] - CLASS
       * § info: Handling any errors caused,
       *  and automatically writes an errorlog into /lib/errorLog.txt
       * § extending: Exception
       */

     
    class errorHandler extends Exception {

      
    /** -- VARIABLE DECLARATION -- */

      
    public $message;

      
    /** -- [__construct] - FUNCTION --
       * § access: public
       * § reference: none
       * § returns: none
       * § constructor of [errorHandler]-class calling to
       *  [Exception]-function of [Exception]-class      
       */

      
    public function __construct($message) {

       
    parent::Exception($message);
     
      } 
    /* <close function> */
     
    /* <close class> */ 
    Wenn ich nun in meiner /index.php diesen Code ausführen will:

    PHP-Code:
    try {
      
    libraries::load('userManagement');
     }
     
     catch (
    errorHandler $error) {
      echo 
    'errorHandler: '.$error;
     } 
    erhalte ich folgende Fehlermeldung:

    Fatal error: Call to undefined method Exception::exception() in /lib/lib.errorHandler.php on line 31
    Mir erschließt es sich nicht genau, warum ich diesen Fehler erhalte. Ich muss doch die Exception-Klasse nicht extra einbinden, da diese doch durch das extends Exception aktiviert wird?

    Ich würde mich über eine Antwort freuen, die meinen weiteren Weg auf der großen Straße des Exception-Handlings ebnet
    Zuletzt geändert von ApoY2k; 13.01.2008, 13:19.
    This is what happens when an unstoppable force meets an immovable object.

  • #2
    Ich muss doch die Exception-Klasse nicht extra einbinden
    doch.

    gruß
    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Ahja? Seltsam... in dem Buch wird die nirgends eingebunden.

      Wie kann man die einbinden? Eine richtige URL hat sie ja irgendwie nicht?
      This is what happens when an unstoppable force meets an immovable object.

      Kommentar


      • #4
        arbeite mit autoload. ich habe dazu mal ein zugebenermaßen etwas sinnfreies tutorial verfaßt. da wird aber alles erklärt.

        gruß
        peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Die class Exception gehört zur spl und muss glaube ich nicht extra eingebunden werden. Viel wichtiger ist, dass du eine Methode exception($message) aus dieser Basisklasse aufrufen möchtest, die so gar nicht existiert (weil php den Konstruktor über __construct und nicht über den Klassennamen definiert).

          Was du meinstest war wohl:
          PHP-Code:
          parent::__construct($message); 

          Kommentar


          • #6
            Die class Exception gehört zur spl und muss glaube ich nicht extra eingebunden werden.
            muss sie auch nicht. aber wenn ich eine eigene exceptionklasse definiere, muss ich die natürlich irgendwie einbinden.

            gruß
            peter
            EDIT:
            sehe gerade, dass ich blödsinn geredet habe. bitte vergessen, was ich gesagt habe.
            Zuletzt geändert von Kropff; 09.01.2008, 19:07.
            Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
            Meine Seite

            Kommentar


            • #7
              das ist natürlich richtig. Aber aus seinen Antworten und insbesondere aus der gegebenen Fehlermeldung hab ich jetzt mal geschlossen, dass er die Basisklasse Exception meinte und nicht seine eigene. Sonst hätte er die Fehlermeldung bekommen, dass die Klasse errorHandler nicht existiert.

              btw.: Klassennamen sollten nach Konvention mit einem Großbuchstaben beginnen ^^

              EDIT:
              ^^ zu spät...heut ist mal wieder rapidWriting angesagt :-)
              Zuletzt geändert von ZombieChe; 09.01.2008, 19:11.

              Kommentar


              • #8
                Okay ich werde das mal versuchen...

                Seltsamerweise steht in meinem PHP-Buch folgendes:

                Zu beachten ist hierbei, dass der Konstruktor mit parent::Exception() und nicht mit __construct() aufgerufen wird.
                Hat das Buch nun Unrecht oder übersehe ich eine Kleinigkeit?

                EDIT:

                Mit parent::__construct() funktioniert es tadellos. Aber ich verstehe nicht, warum die im Buch so einen Schwachfug schreiben...

                Zuletzt geändert von ApoY2k; 09.01.2008, 19:40.
                This is what happens when an unstoppable force meets an immovable object.

                Kommentar


                • #9
                  Aber ich verstehe nicht, warum die im Buch so einen Schwachfug schreiben
                  kann passieren, autoren und lektoren sind auch nur menschen. ich habe da auch schon den ein oder anderen fall erlebt.

                  gruß
                  peter
                  Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                  Meine Seite

                  Kommentar


                  • #10
                    Kommt davon wenn man Bücher liest
                    [FONT="Helvetica"]twitter.com/unset[/FONT]

                    Shitstorm Podcast – Wöchentliches Auskotzen

                    Kommentar


                    • #11
                      Ich möchte hierfür jetzt kein extra Thema eröffnen, also schreibe ich es einfach hier herein.

                      Ich bin jetzt etwas weiter mit den Exceptions gekommen und soweit hat auch alles gut geklappt.

                      Allerdings passiert jetzt etwas in meinen Augen seltsames, wenn ich absichtlich einen Fehler im Skript verursache um meine Fehlerklasse zu testen.

                      Erst einmal die nötigen Ausschnitte des Codes:

                      /index.php
                      PHP-Code:
                      require_once('lib/lib.core.php');

                      Libraries::load('Language,DataBase'); 
                      /lib/lib.core.php
                      PHP-Code:
                      public function __construct($libraries)
                          {
                              if(
                      is_string($libraries)) {
                                  
                      $conLib explode(','$libraries);
                                  if(
                      is_array($conLib)) {
                                      foreach(
                      $conLib as $library) {
                                          if(
                      file_exists(LIB_DIR.'lib.'.$library.'.php')) {
                                              require_once(
                      LIB_DIR.'lib.'.$library.'.php');
                                          } else {
                                              throw new 
                      ErrorHandler("file ".$library." doesn't exist");
                                          }
                                      }
                                  } else {
                                      throw new 
                      ErrorHandler('error converting [$libraries] into array');
                                  }
                              } else {
                                  throw new 
                      ErrorHandler('[$libraries] must be [string]-type');
                              }
                          }

                          static public function 
                      load($libraries)
                          {
                              try {
                                  return new 
                      Libraries($libraries);
                              } catch (
                      ErrorHandler $error) {
                                  
                      ErrorHandler::raiseError($error);
                              }
                          } 
                      /lib/lib.errorHandler.php
                      PHP-Code:
                      public function __construct($error)
                          {
                              echo 
                      '<fieldset><legend>An Error has occurred</legend>Message: '.$error.'<hr><pre>';
                              echo 
                      parent::getTraceAsString();
                              echo 
                      '</pre><hr></fieldset>';
                          }
                          
                          static public function 
                      raiseError($error)
                          {
                              return new 
                      ErrorHandler($error);
                          } 
                      Ich verursache in der /index.php absichtlich einen Fehler, indem ich die Library Language laden will, welche nicht existiert.

                      Erwartungsgemäß ergibt sich der folgende Fehler:

                      Code:
                      An Error has occurred
                      
                      Message: file Language doesn't exist
                      ----------------
                      #0 /www/htdocs/v154878/draco/lib/lib.core.php(129): Libraries->__construct('Language,DataBa...')
                      #1 /www/htdocs/v154878/draco/index.php(17): Libraries::load('Language,DataBa...')
                      #2 {main}
                      ----------------
                      Genau was ich erwartet hatte und auch verursachen wollte.

                      Jedoch erscheint darunter noch ein zweiter Fehler, den ich mir nicht erklären kann:

                      Code:
                      An Error has occurred
                      
                      Message: exception 'ErrorHandler' in /www/htdocs/v154878/draco/lib/lib.core.php:104 Stack trace:
                      #0 /www/htdocs/v154878/draco/lib/lib.core.php(129): Libraries->__construct('Language,DataBa...')
                      #1 /www/htdocs/v154878/draco/index.php(17): Libraries::load('Language,DataBa...')
                      #2 {main}
                      ----------------
                      #0 /www/htdocs/v154878/draco/lib/lib.core.php(131): ErrorHandler::raiseError(Object(ErrorHandler))
                      #1 /www/htdocs/v154878/draco/index.php(17): Libraries::load('Language,DataBa...')
                      #2 {main}
                      ----------------
                      Mir ist nicht wirklich klar, warum zwei Fehler verursacht werden.

                      Ich hoffe mal, jemand kann mir weiterhelfen
                      Zuletzt geändert von ApoY2k; 13.01.2008, 13:21.
                      This is what happens when an unstoppable force meets an immovable object.

                      Kommentar


                      • #12
                        ErrorHandler erbt von Exception und bei raiseError erzeugst du eine neue Instanz:
                        PHP-Code:
                        static public function raiseError($error)
                            {
                                return new 
                        ErrorHandler($error);
                            } 
                        Es wird also noch eine Exception geworfen.
                        Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                        Kommentar


                        • #13
                          Heißt das, um den zweiten "falschen" Fehler zu verhindern, dürfte ich das try {} catch {} gebilde nicht in einer eigenen Methode schreiben sondern sollte es in direkt in der Index schreiben?

                          Also so in der Art:

                          PHP-Code:
                          try {
                              
                          Libraries::load('Language,DataBase');
                          } catch (
                          ErrorHandler $error) {
                              
                          ErrorHandler::raiseError()

                          Oder das ganze Errorhandling nicht im Contstructor sondern gleich in der raiseError()-Methode erledigen?
                          This is what happens when an unstoppable force meets an immovable object.

                          Kommentar

                          Lädt...
                          X