Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Hello,
je rencontre un petit problème concernant mon projet.
Dans mon index.php j'initialise le Zend_Controller_Front:
... $front = Zend_Controller_Front::getInstance(); $front->throwExceptions($config->debug->throwExeption); $front->setControllerDirectory('../application/controllers'); $front->setBaseUrl($config->www->baseurl); $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array( 'controller' => 'error', 'action' => 'display' ))); ...
Avec la gestion des erreurs via un controlleur.
Jusque la tout va bien.
$config correspond à un fichier .ini de config.
En local la variable $config->debug->throwExeption est à true et sur le serveur de production il est à false.
Cependant j'ai remarqué sur le serveur de prod qu'a false, le script continue l'exécution du code et ne s'arrête pas! vous me suivez ? (je l'ai remarqué à grace à une gestion du cache)
Le problème c'est que si je le met à true sur le serveur ben l'envoi d'une page 404 n'est plus possible vu qu'on affiche l'erreur.
Donc ma question est:
est ce possible de stopper l'exécution du script lorsque en lançant une exception, tout en appelant le controlleur d'erreur qui lui va afficher une 404?
D'avance merci
Hors ligne
si vous avez ce type de message?
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified [color=#FF0000](error)[/color]' ...
il faut lire ceci
cliquez ici
Hors ligne
non les messages d'erreurs sont bien intercepté.
Le pb vient du fait que si je met mon param throwExeption à false le script continue de s'exécuter pour afficher une page 404.
J'aurais souhaité que dès lors que exception est lancé il peu soit s'afficher (jusque la pas de problème) ou afficher une page 404 sans exécuter la suite du script. Et c'est bien la tout mon pb.
N'y a t il pas une facon de stopper l'exécution du script, en affichant une page 404 tout en arrêtant l'exécution de la suite du script ?
Hors ligne
A partir du moment où ton script faire un "throw" alors ton script EST interrompu. C'est pas lié à Zend mais à PHP5.
L'exception remonte alors la pile des appels jusqu'à ce qu'elle soit interceptée (try {} catch() {}) et en dernier recours elle l'est par le contrôleur qui redirige la réponse vers le contrôleur d'erreur (ErrorController) qui lui affiche l'erreur de manière "jolie".
throwExceptions(true) veut dire que ton contrôleur ErrorController ne sera pas appelé mais l'erreur affichée à l'écran selon ta configuration PHP.
throwExceptions(false) veut dire que ton contrôleur ErrorController sera appelé et l'erreur affichée selon ce que fait ton action.
A mon avis tu ne dois pas gérer ton erreur correctement ou alors faire un catch sans ensuite faire un die() ou un exit() ou un autre "throw".
Hors ligne
Je ne sais pas si c'est une erreur de recopie sur le forum, mais il y a une erreur juste ici :
$front->throwExceptions($config->debug->throwExCeption);
=> le "C" de Exception ==> fin de ligne
Hors ligne
S'il l'a écrit faux dans son fichier de configuration, vaut mieux qu'il l'écrive faux partout... ou alors juste partout.
Hors ligne
Nikko a écrit:
Je ne sais pas si c'est une erreur de recopie sur le forum, mais il y a une erreur juste ici :
Code:
$front->throwExceptions($config->debug->throwExCeption);=> le "C" de Exception ==> fin de ligne
oui petite erreur de recopie.
keilnoth a écrit:
A partir du moment où ton script faire un "throw" alors ton script EST interrompu. C'est pas lié à Zend mais à PHP5.
L'exception remonte alors la pile des appels jusqu'à ce qu'elle soit interceptée (try {} catch() {}) et en dernier recours elle l'est par le contrôleur qui redirige la réponse vers le contrôleur d'erreur (ErrorController) qui lui affiche l'erreur de manière "jolie".
throwExceptions(true) veut dire que ton contrôleur ErrorController ne sera pas appelé mais l'erreur affichée à l'écran selon ta configuration PHP.
throwExceptions(false) veut dire que ton contrôleur ErrorController sera appelé et l'erreur affichée selon ce que fait ton action.
A mon avis tu ne dois pas gérer ton erreur correctement ou alors faire un catch sans ensuite faire un die() ou un exit() ou un autre "throw".
ok je crois savoir d'ou le problème peut venir.
En fait il y a une exception qui est levée sous certaines conditions au niveau d'un plugin perso.
Est il possible que malgré le lancement de l'exception dans ce plugin, le script continue à tourner du fait d'un try/catch intern géré au niveau de la fonction registerPlugin ? et par conséquent le pb viendrait que l'exception est lancée au niveau du plugin.
voici mon code:
$front->registerPlugin(new My_NewPlugin() );
Hors ligne
Bonjour à tous,
Je suis confronté au même souci:
J'ai des exceptions qui peuvent se déclencher dans mes plugins.
Or le errorHandler (Plugin) de Zend ne fonctionne qu'au niveau d'un postDispatch et donc apres le rendu de la première action.
Le souci, c'est qu'une exceptions levée dans un de mes plugins est du type critique.
Pour moi, les plugins initialises les bases de mon projet si je peux dire et donc, lors d'une exception je dois tout arrêter avant la première action. Il n'est pas donc pas possible de se servir du plugin errorHandler.
Comment gerez vous les exceptions dans les plugins?
Par exemple, le plugin initializer->initDb() initialise ma connexion à ma base de données.
Si par exemple, la connexion échoue, alors une exception Zend_Db_Exception est levée.
A ce moment là que faites vous? Je rappel que le errorHandler est actif qu'après la première action :-(
Hors ligne
C'est pas compliqué
try { $front->dispatch(); } catch (Excpetion $e) { echo .... }
Hors ligne
et non car l'exception est stockée dans l'object response...
Ton astuce dépend de Zend_Controller_Front::getInstance()->throwExceptions(XXXX);
Si XXXX est à "true" ok ca marche, s'il est à "false" comme dans la plupart des cas, cela ne marche plus :-(
Dernière modification par aikido (08-04-2009 16:21:45)
Hors ligne
Pages: 1