Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
ça fait 3 jours que je suis sur ce problème et je comprends plus rien
Je souhaite simplement gérer mes exceptions selon l'état "prod" ou "dev"
Voici mon fichier index.php
<?php /** * Initialisation des variables de langue **************************************************************************/ date_default_timezone_set('Europe/Paris'); setlocale(LC_ALL, 'fr_FR'); /** * Inclusion des fichiers de l'application et debut de la session **************************************************************************/ require(dirname(__FILE__) . "/../app/config/config.conf.php"); Zend_Session::start(); /** * Configuration et initialisation du controlleur frontal **************************************************************************/ $frontController = Zend_Controller_Front::getInstance(); $frontController -> registerPlugin(new InitApplicationFront(ENVIRONNEMENT_DEV)); /** * Execution du Framework **************************************************************************/ try { $frontController -> dispatch(); } catch(Exception $Exception) { die("Une erreur s'est produite : <pre>" . $Exception -> getMessage() . "</pre>"); }
Pour initialiser mon applis je n'utilise pas la class Zend_Application_Bootsrap mais un plugin :
<?php class InitApplicationFront extends Zend_Controller_Plugin_Abstract { public function __construct($env, $root = null) { $this -> _setEnv($env); if (null === $root) { $root = HOME_DIR; } $this -> _root = $root; $this -> _front = Zend_Controller_Front::getInstance(); $this -> _modules = scandir(MODULES_DIR); $this -> initPhpConfig(); } public function initPlugins() { $this -> _front -> registerPlugin(new InfosVueLayout()); if ( AFFICHER_DEBUG == true ) { $this -> _front -> registerPlugin(new Imedia_Controller_Plugin_Debug(Zend_Registry::get('DB'))); } $errorHandler = new Zend_Controller_Plugin_ErrorHandler(); $errorHandler -> setErrorHandlerModule('default') -> setErrorHandlerController('error') -> setErrorHandlerAction('error'); $this -> _front -> registerPlugin($errorHandler); } public function routeStartup(Zend_Controller_Request_Abstract $request) { $this -> initPlugins(); } }
Et enfin mon controller Error qui se trouve dans app/modules/default/controllers/ErrorController.php
<?php class ErrorController extends Zend_Controller_Action { private $_exception; private static $errorMessage; private static $httpCode; public function preDispatch() { $this->_helper->viewRenderer->setNoRender(true); // ne rend aucune vue automatiquement $this->_exception = $this->_getParam('error_handler'); $this->_response->clearBody(); // on vide le contenu de la réponse $this->_response->append('error',null); // on ajoute un segment 'error' dans la réponse switch ($this->_exception->type) { case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: self::$httpCode = 404; self::$errorMessage = 'Page introuvable'; break; case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER: switch (get_class($this->_exception->exception)) { case 'Zend_View_Exception' : self::$httpCode = 500; self::$errorMessage = 'Erreur de traitement d\'une vue'; break; case 'Zend_Db_Exception' : self::$httpCode = 503; self::$errorMessage = 'Erreur de traitement dans la base de données'; break; case 'Metier_Exception' : self::$httpCode = 200; self::$errorMessage = $this->_exception->exception->getMessage(); break; case 'Autre_Exception' : self::$httpCode = 500; self::$errorMessage = 'Exemple avec une "autre exception"'; break; default: self::$httpCode = 500; self::$errorMessage = 'Erreur inconnue'; break; } break; } } public function errorAction() { $this -> getResponse() -> setHttpResponseCode( self::$httpCode); $this -> _errorMessage .= sprintf("<p>%s</p>", self::$errorMessage); } public function postDispatch() { $this->getResponse()->appendbody($this->_errorMessage,'error'); $this->getResponse()->appendbody('<a href="javascript:history.back()">retour</a>','error'); if (Zend_Registry::get('config')->debug == 'true') { $message = sprintf('<hr>DEBUG INFOS :<br /><strong>Exception de type <em>%s</em> <u>%s</u> envoyée dans %s à la ligne %d </strong> <p>Stack Trace : %s </p><hr>', get_class($this->_exception->exception), $this->_exception->exception->getMessage(), $this->_exception->exception->getFile(), $this->_exception->exception->getLine(), Zend_Debug::dump($this->_exception->exception,null,false) ); $this->getResponse()->append('debug',$message); } } }
Bien sur ça ne fonctionne pas.
Si je donne une adresse bidon ou si quelque part je lève une exception elle est affichée brutalement comme avec un die().
l'utilisation du <pre> dans le try / catch du fichier index n'est même pas pris en compte.
J'ai même essayé ça mais sans changement :
try { define("TPS_DEBUT", microtime()); /** * Initialisation des variables de langue **************************************************************************/ date_default_timezone_set('Europe/Paris'); setlocale(LC_ALL, 'fr_FR'); /** * Inclusion des fichiers de l'application et debut de la session **************************************************************************/ require(dirname(__FILE__) . "/../app/config/config.conf.php"); Zend_Session::start(); /** * Configuration et initialisation du controlleur frontal **************************************************************************/ $frontController = Zend_Controller_Front::getInstance(); $frontController -> registerPlugin(new InitApplicationFront(ENVIRONNEMENT_DEV)); /** * Execution du Framework **************************************************************************/ $frontController -> dispatch(); } catch(Exception $Exception) { die("Une erreur s'est produite : <pre>" . $Exception -> getMessage() . "</pre>"); }
Là j'avoue ne pas savoir ce qui bloque :'(
Merci pour votre aide
Cordialement,
Kaimite
Hors ligne
En relisant mon post j'ai pensé à un p'tit truc... En fait c'est bien ma version PHP qui apparement ne gere pas le try catch.
J'ai fait un simple fichier de test avec une exception et sur mon serveur de DEV (mac avec MAMP, PHP 5.2.6) il ne tient pas compte du try / catch alors que sur mon serveur en ligne ( un kimsufi avec PHP 5.1.6 ) ça fonctionne...
Peut-on activer / désactiver le try / catch ?
Merci pour vos réponses.
Kaimite
Dernière modification par Kaimite (07-10-2009 16:30:30)
Hors ligne
D'après ce que j'ai compris, je pense qu'il faut mettre dans ton "bootstrap"
$frontController->throwExceptions(false);
Hors ligne
Salut,
En fait l'erreur ne vient pas de Zend mais de mon serveur de dev...
Sur le fichier suivant :
<?php try { throw new Exception('Erreur de moi'); } catch ( Exception $e ) { die("Erreur : " . $e -> getMessage()); }
A mon boulot j'obtiens :
PHP Fatal error: Uncaught exception 'Exception' with message 'Erreur de moi' in /Users/pilou/Sites/test/exception.php:3
Stack trace:
#0 {main}
thrown in /Users/pilou/Sites/test/exception.php on line 3
Alors que chez moi c'est :
Erreur : Erreur de moi
Bizarrement c'est sur pratiquement la même config : iMac (pas les mêmes) avec MAMP Pro (les mêmes) ...
Va falloir que je regarde pourquoi PHP refuse d'attraper les exceptions
Cordialement,
Kaimite
Hors ligne
Pages: 1