Ergebnis 1 bis 10 von 10

Thema: verwende ich exceptions richtig

  1. #1
    Unregistriert
    Gast

    Standard verwende ich exceptions richtig

    guten tag.

    soll man exceptions auch zur user input validierung verwenden?
    oder nur für fehlzustände im programm?

    also zum beispiel

    CheckUsername($name) {
    if(strlen(name)>4)
    throw new Exception("zu kurz")....
    }
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!

  2. #2
    Kaiser(in)
    Registriert seit
    29.03.2009
    Ort
    1011 1111 1011 WorldWideWeb
    Beiträge
    2.439
    Danke
    2
    Bekam 6 mal "Danke" in 6 Postings

    Standard AW: verwende ich exceptions richtig

    Kann man. Allerdings musst du da eher eine UsernameInvalidException werfen, nur Exception ist ziemlich ungenau und kann ich richtig abgefangen werden.

    EDIT:
    Als Beispiel hier ein Auszug aus einer Login-Methode die ich regelmäßig benutze:

    PHP-Code:
    class User
    {
    /** blabla **/

        /**
         * ... doku ...
         * @throws MySqlQueryException, PermissionBlockedException, NotFoundException, PermissionDeniedException
         * @return User
         */
        
    public static function loginAs($username$password) {
        
            
    // Login-Blockzeit prüfen (zu viele falsche PWs...) //
            
            
    if (true)
            { 
    // der login is noch geblockt    
                
    throw new PermissionBlockedException();
            }

            
    // datensatz des users auslesen //
            
            
    if (!$users_exists)
            { 
    // den Users gibts nicht
                
    throw new NotFoundException();
            }
            
            
    // passwort prüfen
            
    if (!$pw_ok)
            { 
    // falsches passwort
            
                // counter für falsche logins setzen bzw. erhöhen
                
                // bei erreichen des limits den login für die IP sperren
                
                
    throw new PermissionDeniedException();
            }
            
            
    self::$currentUser = new User($row);
            
    $_SESSION['user'] = self::$currentUser;
            return 
    self::$currentUser;
        }

    Geändert von Tobse (23.05.2013 um 01:56 Uhr)
    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.
    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  3. #3
    Großmeister(in)
    Registriert seit
    09.12.2008
    Ort
    Berlin
    Alter
    38
    Beiträge
    666
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard AW: verwende ich exceptions richtig

    Zitat Zitat von Tobse Beitrag anzeigen
    Kann man. Allerdings musst du da eher eine UsernameInvalidException werfen, nur Exception ist ziemlich ungenau und kann ich richtig abgefangen werden.
    Naja, außer in wirklich großen Projekten an denen mehrere Leute arbeiten und die umfangreich konzeptioniert und dokumentiert werden, schmeiße ich auch immer nur normale Exceptions. Die Genauigkeit erhalte ich über die Message die geschmissen wird, da kann ich sogar noch viel präziser werden als einfach nur durch den Klassennamen der Exception.
    Wo das Problem beim abfangen sein soll kann ich auch nicht wirklich erkennen.
    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  4. #4
    Kaiser(in)
    Registriert seit
    29.03.2009
    Ort
    1011 1111 1011 WorldWideWeb
    Beiträge
    2.439
    Danke
    2
    Bekam 6 mal "Danke" in 6 Postings

    Standard AW: verwende ich exceptions richtig

    Das Problem ist folgendes:
    PHP-Code:
    function registerUser($name, array $data)
    {
        
    // username zu kurz
        
    throw Exception();
        
        
    // username zu lang
        
    throw Exception();
        
        
    // username enthält zu kurzes Zeichen
        
    throw Exception();
        
        
    // username gibts bereits
        
    throw Exception();
        
        
    // datenbank mag nicht
        
    throw Exception();
        
        
    // bestätigungs-mail konnte nich gesendet werden
        
    throw Exception();

    Egal welcher fehler aufritt, es fliegt immer nur Exception. D.h. du musst noch einen switch-case block einführen um die Verschiedenen Szenarien zu behandeln (andere Fehlermeldung ausgeben).

    PHP-Code:
    function registerUser($name, array $data)
    {
        
    // username zu kurz
        
    throw UsernameInvalidException("too_short");
        
        
    // username zu lang
        
    throw UsernameInvalidException("too_long");
        
        
    // username enthält zu kurzes Zeichen
        
    throw UsernameInvalidException("unsupported_char");
        
        
    // username gibts bereits
        
    throw UsernameExistsException();
        
        
    // datenbank mag nicht
        
    throw MySqlException();
        
        
    // bestätigungs-mail konnte nich gesendet werden
        
    throw IOException("email_fail");

    Jetzt kannst du z.B. im fall einer UsernameInvalidException immer die gleiche Fehlermeldung ausgeben (z.B. "Username ungültig") und/oder die Message in Verbindung mit einer Sprachdatei nutzen und dynamisch die passende Meldung erstellen.
    Bei allen anderen Exceptions der Funktion (UsernameExistsException, MySqlException, IOException) weisst du stehts schon zum Zeitpunkt des Programmierens, was genau falsch gelaufen ist und nicht erst zur runtime. Dazu kommt, dass der Code übersichtlicher (und für aussenstehende einfacher zu lesen) wird, sowie das Programm merkbar schneller, wenn es sich um Boilerplate-Code handelt.
    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.
    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  5. #5
    Großmeister(in)
    Registriert seit
    09.12.2008
    Ort
    Berlin
    Alter
    38
    Beiträge
    666
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard AW: verwende ich exceptions richtig

    PHP-Code:
    function registerUser($name, array $data)
    {
        
    // username zu kurz
        
    throw Exception("username zu kurz");

        
    // username zu lang
        
    throw Exception("username zu lang");

        
    // username enthält zu kurzes Zeichen
        
    throw Exception("username enthält zu kurzes Zeichen");

        
    // username gibts bereits
        
    throw Exception("username gibts bereits");

        
    // datenbank mag nicht
        
    throw Exception("datenbank mag nicht");

        
    // bestätigungs-mail konnte nich gesendet werden
        
    throw Exception("bestätigungs-mail konnte nich gesendet werden");
    }
    try {
        
    registerUser($name,$data);
        echo 
    "User wurde erfolgreich registriert.";
    }
    catch(
    Exception $e) {
        echo 
    $e->getMessage();

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  6. #6
    Kaiser(in)
    Registriert seit
    29.03.2009
    Ort
    1011 1111 1011 WorldWideWeb
    Beiträge
    2.439
    Danke
    2
    Bekam 6 mal "Danke" in 6 Postings

    Standard AW: verwende ich exceptions richtig

    Was ist mit Mehrsprachigkeit? Was ist mit spezieller Fehlerbehandlung? Wenn z.B. der user schon in der Datenbank steht, die E-Mail aber nicht raus ging (höchstwahrscheinlich, weil die Adresse flasch ist) musst du ihn wieder löschen, damit er sich mit einer korrekten E-Mail wieder registrieren kann.
    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.
    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  7. #7
    Großmeister(in)
    Registriert seit
    09.12.2008
    Ort
    Berlin
    Alter
    38
    Beiträge
    666
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard AW: verwende ich exceptions richtig

    Also ich bitte dich Tobse...
    Das war selbstverständlich nur ein simplifiziertes Beispiel. Selbstverständlich werden die Fehlermeldungen in der Praxis mittels Platzhaltern, Variablen oder Konstanten gesetzt.
    Genauso kann man zusätzlich Errorcodes angeben. Und ob man jetzt zig verschiedene Catch-Blöcke schreiben muss um die verschiedenen Exceptions abzufangen, oder ob man ein switch-Anweisung für die Errorcodes schreibt, ist nun wirklich kein nennenswerter Unterschied. Ich habe ein komplettes Framework und ein ORM selber geschrieben und schon mehr Projekte umgesetzt als ich noch zählen kann. Früher meinte ich auch es wär toll für jeden Blödsinn eine eigene Exception zu definieren. Die Erfahrung hat mich gelehrt, dass es überflüssig ist, ich habe es noch nicht ein einziges Mal benötigt.
    Wenn du persönlich es toller findest unzählige verschiedene Exceptions zu definieren dann tu das, aber behaupte bitte nicht das wäre nötig.
    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  8. #8
    Kaiser(in)
    Registriert seit
    29.03.2009
    Ort
    1011 1111 1011 WorldWideWeb
    Beiträge
    2.439
    Danke
    2
    Bekam 6 mal "Danke" in 6 Postings

    Standard AW: verwende ich exceptions richtig

    Das es nötig ist, habe ich nicht behauptet. Du kannst auch für jede Methode eine Zuweisung von Rückgabewert zu Fehler / korrekter Ausführung definieren (so wie es in PHP leider mit z.B. strpos noch so is). Dass das aber nicht gerade Best-Practice ist, werde ich dir nicht sagen müssen.

    Ich, im Gegensatz zu dir, habe in Projekten mit mehreren Programmierern die Erfahrung gemacht, dass des einen unnötigen Auwand darstellt, sich durch die einzelnen Messages für Exception für jede Methode durchzuarbeiten anstatt einen Satz von 20 Excpetions auswendig zu kennen, der überall Anwendung findet. Soll sich der TE aussuchen, was besser ist.
    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.
    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  9. #9
    Meister(in) Avatar von lukasn
    Registriert seit
    23.02.2008
    Ort
    Schweiz
    Alter
    27
    Beiträge
    491
    Danke
    2
    Bekam 12 mal "Danke" in 11 Postings

    Standard AW: verwende ich exceptions richtig

    Das mal beiseite, verwendet ihr wirklich Exceptions für Validierungsfehler? Das gehört für mich zum normalen Programmablauf, Exceptions verwende ich nur für Ereignisse, die eigentlich nicht auftreten sollten, z.B. HTTP-Exceptions (404, 500 etc.), Datenbankfehler und ähnliches.

    Allerdings nehme ich die Validierung mittlerweile sowieso meist auf dem Client vor, Serverseitig löse ich dann auch eine ValidationException aus welche ein Array von Fehlern zurück gibt. Allerdings tritt diese Exception ja dank der Client-seitigen Validierung nur dann auf, wenn die Daten mutwillig verändert wurden, damit handelt es sich eben wieder um eine Ausnahme ausserhalb des normalen Programmablaufs und verdient damit eine Exception.
    Geändert von lukasn (24.05.2013 um 15:57 Uhr) Grund: Verständlicher formuliert um missverständnisse zu vermeiden

  10. #10
    Großmeister(in)
    Registriert seit
    09.12.2008
    Ort
    Berlin
    Alter
    38
    Beiträge
    666
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard AW: verwende ich exceptions richtig

    Zitat Zitat von Tobse Beitrag anzeigen
    Ich, im Gegensatz zu dir, habe in Projekten mit mehreren Programmierern die Erfahrung gemacht, dass des einen unnötigen Auwand darstellt, sich durch die einzelnen Messages für Exception für jede Methode durchzuarbeiten anstatt einen Satz von 20 Excpetions auswendig zu kennen, der überall Anwendung findet. Soll sich der TE aussuchen, was besser ist.
    Und was vermutest du, wieviele der Leute die so etwas in einem Forum fragen in Teams an wirklich großen Projekten arbeiten? Ich bin grundsätzlich auch immer für klare Strukturen, Abstraktionen, Aufteilungen von Aufgabenbereichen und entsprechende Kapselung. Wie gesagt habe ich es für Exceptions aufgegeben weil mir noch nicht ein Fall untergekommen ist, wo es mir einen echten Mehrwert geboten hätte.
    Das Beispiel "User wird in die Datenbank eingetragen aber dann kann die E-Mail nicht gesendet werden" ist für mich obsolet, da Validierung, Speicherung in der DB und Versand von E-Mails für mich drei verschiedene Aufgaben sind die nicht in einer Methode abgearbeitet werden. Unter anderem auch aus diesem Grund der klaren Trennung von Aufgabenbereichen machen für mich verschiedene Exceptions nicht sonderlich Sinn. Die Art der Exception wird so schon durch die Stelle an der sie auftritt definiert, da brauch ich keine eigene Klasse für definieren.

    Aber wie du schon sagst, der TE soll selber schauen wie es für ihn am meisten Sinn ergibt. Ich fand nur deine Formulierung im ersten Post zu strikt.

    @lukasn:
    Exceptions schmeiße ich dann, wenn eine Funktion/Methode die Aufgabe für die sie gedacht ist nicht ausführen kann. Eine Funktion registerUser() soll einen User registrieren. Kann sie diese Aufgabe nicht ausführen wird eine Exception geschmissen. Anders sähe es beispielsweise bei einer Funktion isValid() aus, da gehört es zur Aufgabe der Funktion Daten zu validieren, und eine fehlgeschlagene Validation ist in dem Fall keine Exception.
    Geändert von SinnlosS (24.05.2013 um 18:42 Uhr)
    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 13.08.2012, 22:09
  2. richtig coden
    Von viper3000 im Forum HTML & CSS Forum
    Antworten: 41
    Letzter Beitrag: 24.10.2008, 18:07
  3. Wie Poste ich richtig?
    Von YunasTenshi im Forum Tutorials, Workshops und Anleitungen
    Antworten: 15
    Letzter Beitrag: 25.02.2006, 22:40
  4. FTP Richtig einstellen
    Von Palestina im Forum Computer - Internet Forum
    Antworten: 4
    Letzter Beitrag: 07.03.2005, 17:12

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •