php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 09-01-2008, 18:44
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard [OOP] Fragen zu Exceptions

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:

Zitat:
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

Geändert von ApoY2k (13-01-2008 um 14:19 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 09-01-2008, 18:50
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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
Mit Zitat antworten
  #3 (permalink)  
Alt 09-01-2008, 19:13
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Ahja? Seltsam... in dem Buch wird die nirgends eingebunden.

Wie kann man die einbinden? Eine richtige URL hat sie ja irgendwie nicht?
Mit Zitat antworten
  #4 (permalink)  
Alt 09-01-2008, 19:39
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #5 (permalink)  
Alt 09-01-2008, 19:57
ZombieChe
 Member
Links : Onlinestatus : ZombieChe ist offline
Registriert seit: Apr 2004
Ort: Hannover
Beiträge: 225
ZombieChe ist zur Zeit noch ein unbeschriebenes Blatt
ZombieChe eine Nachricht über ICQ schicken
Standard

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); 
Mit Zitat antworten
  #6 (permalink)  
Alt 09-01-2008, 20:00
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite

Geändert von Kropff (09-01-2008 um 20:07 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 09-01-2008, 20:09
ZombieChe
 Member
Links : Onlinestatus : ZombieChe ist offline
Registriert seit: Apr 2004
Ort: Hannover
Beiträge: 225
ZombieChe ist zur Zeit noch ein unbeschriebenes Blatt
ZombieChe eine Nachricht über ICQ schicken
Standard

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 :-)

Geändert von ZombieChe (09-01-2008 um 20:11 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 09-01-2008, 20:38
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Okay ich werde das mal versuchen...

Seltsamerweise steht in meinem PHP-Buch folgendes:

Zitat:
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...


Geändert von ApoY2k (09-01-2008 um 20:40 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 09-01-2008, 21:11
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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
Mit Zitat antworten
  #10 (permalink)  
Alt 09-01-2008, 21:15
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

Kommt davon wenn man Bücher liest
Mit Zitat antworten
  #11 (permalink)  
Alt 13-01-2008, 14:17
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

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

Geändert von ApoY2k (13-01-2008 um 14:21 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 13-01-2008, 14:56
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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 | []
Mit Zitat antworten
  #13 (permalink)  
Alt 13-01-2008, 15:01
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

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?
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:29 Uhr.