Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 07-10-2009 16:12:09

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

[ZF 1.9] Gestion des exeptions... je bloque

Bonjour,

ça fait 3 jours que je suis sur ce problème et je comprends plus rien sad

Je souhaite simplement gérer mes exceptions selon l'état "prod" ou "dev"

Voici mon fichier index.php

Code:

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

Code:

<?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

Code:

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

Code:

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

 

#2 07-10-2009 16:29:23

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [ZF 1.9] Gestion des exeptions... je bloque

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

 

#3 07-10-2009 18:38:58

Damien
Membre
Lieu: Tassin la Demi Lune
Date d'inscription: 22-03-2007
Messages: 88

Re: [ZF 1.9] Gestion des exeptions... je bloque

D'après ce que j'ai compris, je pense qu'il faut mettre dans ton "bootstrap"

$frontController->throwExceptions(false);

Hors ligne

 

#4 07-10-2009 19:10:15

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [ZF 1.9] Gestion des exeptions... je bloque

Salut,

En fait l'erreur ne vient pas de Zend mais de mon serveur de dev...

Sur le fichier suivant :

Code:

<?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 sad

Cordialement,
Kaimite

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages