php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 12.12.2008, 12:33  
Neuer Benutzer
 
Registriert seit: 22.11.2007
Beiträge: 15
Luka
Standard 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
Luka ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 12.12.2008, 12:40  
Erfahrener Benutzer
 
Registriert seit: 25.04.2005
Beiträge: 1.356
HStev zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

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.
HStev ist offline  
Alt 12.12.2008, 13:30  
Neuer Benutzer
 
Registriert seit: 22.11.2007
Beiträge: 15
Luka
Standard

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?

Geändert von Luka (12.12.2008 um 13:51 Uhr).
Luka ist offline  
Alt 12.12.2008, 13:33  
Erfahrener Benutzer
 
Registriert seit: 28.09.2008
Beiträge: 1.168
PHP-Kenntnisse:
Fortgeschritten
Koala befindet sich auf einem aufstrebenden Ast
Standard

Du wirfst exception-handling und validierung durcheinander.
Koala ist offline  
Alt 12.12.2008, 13:54  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

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() ]
   
   

robo47 ist offline  
Alt 12.12.2008, 14:24  
Neuer Benutzer
 
Registriert seit: 22.11.2007
Beiträge: 15
Luka
Standard

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.

Geändert von Luka (12.12.2008 um 14:29 Uhr).
Luka ist offline  
Alt 12.12.2008, 14:31  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

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.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 12.12.2008, 20:06  
Erfahrener Benutzer
 
Registriert seit: 19.03.2007
Beiträge: 176
BlackWolf ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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"
BlackWolf ist offline  
Alt 12.12.2008, 20:29  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Stimmt. Da habe ich gar nicht drauf geachtet.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 12.12.2008, 20:39  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
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).
Zitat:
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.
David ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Handling der Datei Includes DER_Brain PHP Tipps 2007 6 21.12.2006 19:36
mysql klasse - handling mehrerer connections mrSpok PHP Tipps 2006 5 14.04.2006 01:05
Array Handling PHP Tipps 2005-2 1 17.10.2005 08:27
enctype=multipart/form-data Handling PHP Tipps 2005-2 2 15.07.2005 12:36
php4: kopiert objekte --- php5: korrektes handling [solved] PHP-Fortgeschrittene 10 27.12.2004 14:11

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
anstatt throw php, \exeption handling\ datenbank, php exception abfangen und weitermachen, exeption handling php, php5 error handling class, was ist exeption, fabrikmethode php5 beispiel, exeption mit php beispiel, exeption php

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:30 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum