hotti: Wohin mit der Fehlermeldung?

hi,

ich will mal wieder bischen was vereinfachen und Benutzereingaben zu einem Objekt verwursten. Bei fehlenden oder fehlerhaften Eingaben soll das Objekt gar nicht erst erstellt werden. Dumme Frage: Wenn ich kein Objekt habe, tja, wo schreibe ich dann die Fehlermeldung hin? Eine für Alle ist mir zu wenig, bischen differenziert werden soll da schon...

  
   my $obj = Klasse->new() || die "Da fehlt der Vorname...";  
   # hmm, kann ja auch der Nachname sein...  

Viele Grüße,
Horst Hilflos

  1. Hi,

    ich will mal wieder bischen was vereinfachen und Benutzereingaben zu einem Objekt verwursten. Bei fehlenden oder fehlerhaften Eingaben soll das Objekt gar nicht erst erstellt werden. Dumme Frage: Wenn ich kein Objekt habe, tja, wo schreibe ich dann die Fehlermeldung hin? Eine für Alle ist mir zu wenig, bischen differenziert werden soll da schon...

    Da würde ich sagen: Beschäftige dich mit Exceptions.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hi,

      ich will mal wieder bischen was vereinfachen und Benutzereingaben zu einem Objekt verwursten. Bei fehlenden oder fehlerhaften Eingaben soll das Objekt gar nicht erst erstellt werden. Dumme Frage: Wenn ich kein Objekt habe, tja, wo schreibe ich dann die Fehlermeldung hin? Eine für Alle ist mir zu wenig, bischen differenziert werden soll da schon...

      Da würde ich sagen: Beschäftige dich mit Exceptions.

      Du bist gemein :-)

      Ja, ne, is klar, anders gehts mit meinem Ansatz nicht. Evntl. doch das Objekt erstellen und ein Attribut "errstr" einbauen...

      Viele Grüße,
      Horst Sorglos

      1. Moin!

        Bei fehlenden oder fehlerhaften Eingaben soll das Objekt gar nicht erst erstellt werden. Dumme Frage: Wenn ich kein Objekt habe, tja, wo schreibe ich dann die Fehlermeldung hin?

        In den Kontext in dem Du die Entscheidung triffst, dass das die Eingaben fehlen oder fehlerhaft sind natürlich. Dort musst Du ja auch entscheiden wie schwerwiegend der Fehler ist: Abbruch wegen fatalen Fehlers, spezielle Reaktion (z.B. Rückkehr zur Eingabe) oder gar nur Notiz ist hier die Frage.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

        1. Moin,

          In den Kontext in dem Du die Entscheidung triffst, dass das die Eingaben fehlen oder fehlerhaft sind natürlich. Dort musst Du ja auch entscheiden wie schwerwiegend der Fehler ist: Abbruch wegen fatalen Fehlers, spezielle Reaktion (z.B. Rückkehr zur Eingabe) oder gar nur Notiz ist hier die Frage.

          Ja, klar. Idealerweise erscheint die Fehlermeldung genau an derselben Stelle, wo die fehlerhafte Eingabe gemacht wurde. Beispiel:

          http://rolfrost.de/cgi-bin/xdate.cgi?d1=29.6.2010&d2=otto&diff=0&comp=Datum+vergleichen

          (ist evntl. ein bischen zu lang der Text...)

          In dem Fall wird das Objekt immer erstellt, auch bei fehlerhaften Eingaben. Also, wenn ich schon die Objekterstellung platzen lasse, hmm mal überschlafen... Exceptions, ja, nein, ja, riecht nach Java ;-)

          Hotti

          1. Hi,

            ein anderer Ansatz waere es zb das ganze auszulagern - da MyClass sicherlich nicht die einzige Klasse sein wird, welche ihre Daten zu validieren hat.

            Nur mal als Beispiel*:
            Hierfuer koenntest du eine abstrakte Klasse "Validator" erstellen, welche folgende Struktur aufweist

            abstract class Validator  
            {  
              protected $Errors = array();  
              
              // Implementor must implement this Method  
              public abstract Validate();  
              
              public function HasErrors()  
              {  
                return sizeof( $this->Errors ) > 0;  
              }  
              
              public function GetErrors()  
              {  
                return $this->Errors;  
              }  
              
              public function GetLastError()  
              {  
                return array_pop( $this->Errors );  
              }  
            } 
            

            Je nach dem, ob die Validierung tatsaechlich nur im Konstruktor stattfinden soll, koenntest du der abstrakten Klasse noch einen Konstruktor verpassen, welcher bei der Erstellung des Implementors die Parent-Validate() Methode aufruft. Abhaengig vom anschlieszenden Ergebnis der Methode HasErrors() kann dann entschieden werden, wie weiter vorgegangen werden soll (Objekt verwerfen, Daten korrigieren, etc.).

            Obwohl ich nicht so ganz verstehe, warum das Objekt als solches erst gar nicht erstellt werden soll. Benoetigte Daten lassen sich ja im Konstruktor deklarieren. Und egal ob das Objekt Fehler aufweist oder nicht, es handelt sich ja schlieszlich um eine Instanz der Klasse - wenn auch um eine invalide, das ist ja durchaus ein gaengiger Zustand eines Objektes.

            MfG
            Maxi

            * Ist jetzt PHP, aber das ist ja egal.

            1. Moin,

              class Validator => Gute Idee, danke!!!

              Obwohl ich nicht so ganz verstehe, warum das Objekt als solches erst gar nicht erstellt werden soll. Benoetigte Daten lassen sich ja im Konstruktor deklarieren. Und egal ob das Objekt Fehler aufweist oder nicht, es handelt sich ja schlieszlich um eine Instanz der Klasse - wenn auch um eine invalide, das ist ja durchaus ein gaengiger Zustand eines Objektes.

              Mir gehts um Vereinfachungen und weniger Code. Ich habe schon ein paar Anwendungen, in denen ich das so handhabe, also wo ich den weiteren Verlauf einfach nur vom Erfolg der Objekterstellung abhängig mache. Diese Anwendungen sind jedoch erstmal nur für mich geschrieben und daher noch nicht soweit gediegen oder ausgereift, dass ich die aus der Hand geben könnte.

              Exceptions (und das ewige try/catch-Gefrickel) gehören abgeschafft, es muss auch noch andere Möglichkeiten geben mit weniger Programmcode.

              Viele Grüße,
              Horst Haselhuhn

              --
              Java ist grausig, MIME ist Müll und die Bibel beantwortet auch nicht alle Fragen.
  2. Hi

    bischen differenziert:
    class xyz_1 extends exception { bla sülz methode....; }
    class xyz_2 extends exception { bla sülz methode....; }

    und dann verpasst du eine Injektion:
    my $obj_1 = Klasse->new($xyz_1);
    my $obj_2 = Klasse->new($xyz_2);

    Gruß

    Nerdi

    1. Hallo nochmal,

      das war ein PHP Beispiel. Vielleicht ist es in Perl ähnlich :-)

      Gruß

      Nerdi