Portal > Foren > PHP > PHP-Programmierung > Exception wird ignoriert. Stattdessen Standard-Fehlermeldung
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 16.11.2006, 12:03 Nach oben    #1
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard Exception wird ignoriert. Stattdessen Standard-Fehlermeldung

Hallo Leute,
ich bin grad dabei, mein Framework zu schreiben und stehe vor einem kleinen Problem:

ich habe folgende Datei index.php:
PHP-Code:
<?php
/**
 * This is the central index file
 * 
 * 
 * @author Johannes Schlichenmaier
 * @change 08.11.2006
 * @package schlichenmaier.info
 * @version 0.1
 * @since 0.1
 *
 * This file is responsible for calling the controller and providing all necessary
 * settings        
 */
 
error_reporting(E_ALL E_NOTICE);
 
 
 
define('ROOT'dirname($_SERVER['SCRIPT_FILENAME']));
 
//define('DIR_SEPARATOR', (substr(ROOT, 0, 1) == '/') ? '/' : '\\');
 
define('DIR_SEPARATOR''/');
 
define('INCLUDE_DIR''inc');
 
 function 
__autoload($classname) {
    
$filename ROOT.DIR_SEPARATOR.INCLUDE_DIR.DIR_SEPARATOR.str_replace('_'DIR_SEPARATOR$classname).'.php';
    
    if(!
is_readable($filename)) {
        throw new 
FSException($filename'cfnf');
    }
    else {
        
$filename str_replace('_'DIR_SEPARATOR$classname).'.php';
        include_once(
$filename);
    } 
}
 
$include_path ROOT.DIR_SEPARATOR.INCLUDE_DIR
 
set_include_path(get_include_path ().';'.$include_path);
 
/* Die Klassen FSException und DefaultException werden eingebunden */
     
 
 
try {
 
/** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 * Hier liegt mein Problem!
 */
 //throw new FSException("Muha"); 
 
$lala = new Muha;
 }
 catch (
Exception $e) {
     echo 
$e->getMessage();
 }
 
?>
Dazu gehören die Dateien DefaultException.php:
PHP-Code:
<?php
/**
 * DefaultException
 * This class catchs all exception which aren't belong to a specific type
 * 
 * 
 * @author Johannes Schlichenmaier
 * @change 08.11.2006
 * @package schlichenmaier.info
 * @version 0.1
 * @since 0.1
 *
 * This class is a child class of the standard PHP Exception-Class an forward
 * the recieved exception message to it. By the way, all user defined exception
 * classes referrers to this one class
 */
 
 
class DefaultException extends Exception{
     
     public function 
__construct($exception '') {
         
         
parent::__construct($exception);
     }
 }
?>
und FSException.php:
PHP-Code:
<?php
/**
 * FSException
 * This class catchs all exceptions are trown in relationsship with the
 * file system
 * 
 * 
 * @author Johannes Schlichenmaier
 * @change 08.11.2006
 * @package schlichenmaier.info
 * @version 0.1
 * @since 0.1
 *
 * This class is responsible for exception like not found files or errors with
 * the mask of a file or a dictonary
 */
 
 
class FSException extends DefaultException{
     
     public function 
__construct($exception ''$code '') {
         switch (
$code) {
             case 
'cfnf' $preamble 'Couldn\'t load class file: '; break;
             default : 
$preamble 'Unknown file system error: '; break;
         }
         
$message $preamble.$exception;
         
         
parent::__construct($message);
     }
 }
?>
Nun funktioniert alles wunderbar, wenn ich innerhalb des unteren try-catch-blocks in index.php das auskommentiere throw new FSException("Muha"); aufrufe.
Die Ausgabe ist wie gewünscht:
Zitat:
Unknown file system error: Muha
Wenn ich aber den Code wie hier gepostet aufrufe, dann bekomme ich ein Problem.
Denn dann wirft er keine Exception, sondern gibt einfach eine Standard-Fehlermeldung aus:
Zitat:
Fatal error: Class 'Muha' not found in /opt/lampp/htdocs/schlichenmaier.info/trunk/index.php on line 78
Im Grunde akzeptiere ich das, aber eigentlich läuft es gegen meine Logik. Denn __autoload wird ja innerhalb eines try-catch-Blocks aufgerufen. Aber halt über den Umweg, dass zuerst versucht wird, eine Klasse einzubinden.

Das Dumme ist nur:
Wenn ich um das throw in __autoload einen try-catch-Block mache, bekomme ich immer noch die Standard-Fehlermeldung von PHP.

Die bekomme ich zwar über error_reporting(E_NONE); in den Griff. Aber das ist für mich nicht gerade "sauber".
Gibt es nicht einen anderen Weg, sowas sauber zu lösen, ohne von meinem Weg des Werfens der Ausnahme in __autoload abzukommen?

Ich hoffe, ihr könnt mir helfen.
Danke,
Jojo
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2006, 16:32 Nach oben    #2
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 550
Standard

afaik hilft es dir, wenn du ne fehler-behandlungsfunktion angibst (http://php.net/set_error_handler).
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2006, 17:07 Nach oben    #3
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

Also meinst du, ich soll dann quasi diesen Fehler filtern und einfach nicht ausgeben?
Oder soll ich die Exception in dem benutzerdefinierten Handler werfen?
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2006, 17:11 Nach oben    #4
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

...einfach mal ins Manual schauen und die Notes lesen:

http://php.net/manual/en/language.oop5.autoload.php

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2006, 17:31 Nach oben    #5
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

Autsch!
Das tut weh!

Jetzt wo ich das gelesen habe fällt mir auch noch was Doofes ein:
Ich hab ne ähnliche Idee schonmal fallen gelassen, weil ich ich die Note gelesen habe

//edit:
Huch, aber die erste User contributed Note seh ich zum erstem Mal.
Meintest du die?
Wenn das klappt wär das natürlich genial.

//edit2:
Ich bin mir sicher, dass du das meintest.
Danke!
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int

Geändert von Jojo (16.11.2006 um 17:47 Uhr)
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2006, 17:54 Nach oben    #6
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

Zitat:
Zitat von Jojo Beitrag anzeigen
Huch, aber die erste User contributed Note seh ich zum erstem Mal.
Meintest du die?
Ich hab in meinem Framework (noch) keine Exception aus __autoload() eingerichtet, daher hab ich micht damit noch nicht beschäftigt. Ich dahte mir nur, dass du ja sicher nicht der erste bist, der daran hängt und hab daher mal ins Handbuch geschaut. Als ich dann beim Überfliegen gelesen hab, dass sich schon andere mit dem Thema befasst haben und Lösungen geposted haben, hab ich einfach den Link hier eingebracht.

Übrigens:
Zitat:
Zitat von Jojo Beitrag anzeigen
PHP-Code:
 error_reporting(E_ALL E_NOTICE); 
Is'n Scherz, oder?

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2006, 18:17 Nach oben    #7
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

Eher ein Schusselfehler. Danke ^^

Jetzt habe ich nur noch ein "Problem".
Und zwar habe ich die Error-Funktionen ausgelagert und include sie am Anfang des Scriptes.
Nur tritt jetzt anscheinend folgendes Problem auf:
Jedes Mal, wenn include/require/o.ä. auftritt, wird anscheined zuerst in die __autoload-Funktion gegangen und versucht, sie darüber zu laden.
Denn nun beschwert er sich, weil er eine Exception-Klasse nicht gefunden wurde, die in der __autoload-Funktion gebraucht wird, wenn ich meine Exceptions einbinden will...
-.-
Werd ich wohl einen Workarround machen müssen....

//edit:
Ich habe den Fehler, aber immer noch keine Lösung
Meine erste eingebundene Exceptionklasse ist Kindklasse einer anderern Exceptionklasse. Und anscheinend wartet PHP nicht, bis alle Exceptionklassen eingebunden sind (was auch logisch ist).
Nun.... Hat jemand eine Idee, wie ich das verhindern könnte?
Eventuell, wenn ich das Errorreporting kurzzeitig ausschalte?

//edit:
Dreckig aber es geht....
Aber glücklich bin ich damit nicht....

//edit:
Sorry für die vielen Edits, aber ich bin glaube ich heute etwas voreilig....
Es geht nicht. Is ja auch logisch! Nur weil der Error nicht angezeigt wird, heißt das ja noch nicht, dass es nicht abbricht.

Mein Problem ist eben folgendes, dass ich über ein "tolle" Funktion mein ganzes Exception-Dir include. Und der schaut natürlich nicht nach Namen oder Abhängigkeiten...
Naja, mal schaun, vielleicht fällt mir ja was ein.
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int

Geändert von Jojo (16.11.2006 um 18:31 Uhr)
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2006, 21:38 Nach oben    #8
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 550
Standard

ähm mach das ganze doch so:
überprüfe in der exception-funktion, ob die Exception-klasse geladen wurde (class_exists). Wenn nicht, kannst du von nem schwerwiegenden Fehler ausgehen, der das ganze system unmöglich macht.
also kann das skript dann einfach mit ner entsprechende fehlermeldung abgebrochen werden.
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2006, 22:14 Nach oben    #9
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

Das Problem ist aber doch, dass ich eine Klasse AutoloadException habe, die von DefaultException erbt.
Wenn er nun zuerst AutoloadException includet, versucht er über __autoload die Klasse DefaultException nachzuladen, was jedoch nicht funktioniert, da ich bei den Exceptions eigentlich keine Namespaces möchte.

Dummerweise weiß der Interpreter nicht, dass er die Klasse DefaultException noch nachladen wird.

Ich glaube, ich werde einfach in der __autoload() eine Fallunterscheidung zwischen Exceptionklassen und "normalen" Klassen machen.
Ich denke, das wäre am unkompliziertesten...
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.11.2006, 10:51 Nach oben    #10
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

Macht du das grad in deiner Freizeit? Ich meine, man kann sich auch stundenlang mit sowas aufhalten. *g

Ich benenne meine Dateien und Klassen übrigens immer "komplett":

lib/Mod/Mod_News/Mod_News_View/Mod_News_View_EditForm.php:
class Mod_News_View_Display extends...

Damit hab ich war ellenlange Klassennamen, aber es gibt definitiv keine Konflikte, da ja auch nur eine Datei mit einem Namen in einem Verzeichnis liegen kann.

Übrigens macht der include_path() doch keinen Sinn, wenn du in __autoload() eh immer den absoluten Pfad angibst, oder?

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.11.2006, 15:02 Nach oben    #11
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

Zitat:
Zitat von Basti Beitrag anzeigen
Macht du das grad in deiner Freizeit? Ich meine, man kann sich auch stundenlang mit sowas aufhalten. *g
Jopp. Freizeit. Bei nem Job würde mir das das Genick brechen -)

Zitat:
Zitat von Basti Beitrag anzeigen
Ich benenne meine Dateien und Klassen übrigens immer "komplett":
So mach ich das auch bei allen anderen Klassen.
Nur wollte ich das bei den Exceptions aus kosmetischen Gründen vermeiden.

Zitat:
Zitat von Basti Beitrag anzeigen
Übrigens macht der include_path() doch keinen Sinn, wenn du in __autoload() eh immer den absoluten Pfad angibst, oder?
Stimmt. Das ganze is auch ein wenig rumgespiele für mich. Ich habs jetzt aber so gemacht, dass der inlcude-Path seinen Sinn hat:

Index.php
:
PHP-Code:
<?php
/**
 * This is the central index file
 * 
 * 
 * @author Johannes Schlichenmaier
 * @change 08.11.2006
 * @package schlichenmaier.info
 * @version 0.1
 * @since 0.1
 *
 * This file is responsible for calling the controller and providing all necessary
 * settings        
 */
 
 
 
function __autoload($classname) {
    
$filename str_replace('_'DIR_SEPARATOR$classname).CLASS_FILE_TYPE;
    
    if(
is_readable($filename)) {
        include_once(
$filename);
    }
    elseif(!
preg_match("/^\w+Exception$/"$classname)) {
        
$CFNFException serialize(new FSException($filename'cfnf'));
        
$CFNFException str_replace("'""\\'"$CFNFException);
        
$code 'class '.$classname.' {' .
                    
'    public function __construct($a = "", ' .
                    
'                                $b = "", ' .
                    
'                                $c = "", ' .
                    
'                                $d = "", ' .
                    
'                                $e = "", ' .
                    
'                                $f = "", ' .
                    
'                                $g = "") {' .
                    
'        throw new AutoloadException(\''.$CFNFException.'\');' .
                    
'    }' .
                    
'}';
        return eval(
$code);      
    }
    else {
        include_once(
'Exceptions'.DIR_SEPARATOR.$filename);
    }
 }
 
 
 
 
error_reporting(E_ALL);
 
 
 
define('ROOT'dirname($_SERVER['SCRIPT_FILENAME']));
 
define('DIR_SEPARATOR''/');
 
define('INCLUDE_DIR''inc');
 
define('CLASS_FILE_TYPE''.php');
 
 
$include_path ROOT.DIR_SEPARATOR.INCLUDE_DIR;
 
set_include_path(get_include_path ().';'.$include_path);
 

     
 try {
 
//throw new FSException("Muha");
 
$lala = new Muha;
 }
 catch (
Exception $e) {
     echo 
$e->getMessage();
 }
 
?>
und die AutoloadException.php:
PHP-Code:
<?php
/**
 * AutoloadException
 * Used for throwing an Exception within the magic function __autoload
 * 
 * 
 * @author Johannes Schlichenmaier
 * @change 16.11.2006
 * @package schlichenmaier.info
 * @version 0.1
 * @since 0.1
 *
 * unserializeses an Objekt was overgiven at the __autoload function. Throws it.
 */
 
 
class AutoloadException extends DefaultException{
     public function 
__construct($sException) {
         
$sException str_replace("\\'""'"$sException);
         throw 
unserialize($sException);
     }
 }
?>
Oder soll ich einfach die kosmetischen Gründe vergessen und die Exeptions ebenfalls in Namespaces aufrufen?

Grüße,
Jojo
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int

Geändert von Jojo (17.11.2006 um 19:35 Uhr)
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.11.2006, 16:37 Nach oben    #12
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

Ich gehe davon aus, dass es schneller ist, wenn du einen absoluten Pfad für dein include angibst, anstatt einem, der relativ ist zu deinem include_path. So muss ja in jedem Verzeichns im include_path erstmal nach der Datei geschaut werden. Außerdem vermeidest du, wenn du einen absoluten Pfad angibst, den Fehler wenn irgendwo im include_path eine Datei liegt, die wie deine Klassen-Datei heißt.

Was die Exceptions angeht:
Musst du schon selber wissen, wie du die benennen willst. Ist wahrscheinlich keine schlechte Idee, die z.B. Exception_FileSystem zu bennenen und dann eben alle Exceprions im Verzeichnis lib/Exception/ zu haben. Falls nicht würde ich aber in jedem Fall das preg_match() durch substr() ersetzen.

Außerdem würde ich das inclue_once durch include ersetzen, denn die Datei wurde ja definitiv noch nicht eingebunden (falls du konsequent alles über __autolad() lauen lässt, wovon ich ausgehe) und include_once ist ziemlich lahm.

Und mit den Dateinamen überleg ich mir auch nochmal, ob ich das nicht doch so mache, wie du und nicht jedem Verzeichnis/jeder Datei den "vollen" Namen geben:

lib/Mod/News/View/Display.php anstatt
lib/Mod/Mod_News/Mod_News_View/Mod_News_Display.php

Ist halt so (wie bei mir) in Editoren viel schneller erfasbar, welche der offenen Dateien welche ist. In Kate würde sonst in der Liste der ffenen Dateien oder in der Tab-Bar nur Folgendes stehen:

Controller.php
Controller.php (2)
Controller.php (3)
Controller.php (4)

Anstatt eben

Mod_Page_Controller.php
Mod_User_Controller.php
Mod_MlText_Controller.php
Mod_News_Controller.php

Der Nachteil ist, dass es ätzend ist, Module zu kopieren oder umzubenennen.

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

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 sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom/JDOMException Arvodan Allgemeine Java-Programmierung 15 03.02.2006 09:12


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45