IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

Gestion des erreurs avec error_handler


Sujet :

MVC PHP

  1. #1
    Membre éclairé Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Par défaut Gestion des erreurs avec error_handler
    bonjour,
    je souhaiterais mettre en place une gestion des erreurs sur mon applis.
    j'ai mis un controller Error comme dans la doc en ajoutant un certain nombre de cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    <?php
     
    /**
     * Error controller
     *
     * @uses       Zend_Controller_Action
     * @package    QuickStart
     * @subpackage Controller
     */
    class ErrorController extends Zend_Controller_Action
    {
        /**
         * errorAction() is the action that will be called by the "ErrorHandler" 
         * plugin.  When an error/exception has been encountered
         * in a ZF MVC application (assuming the ErrorHandler has not been disabled
         * in your bootstrap) - the Errorhandler will set the next dispatchable 
         * action to come here.  This is the "default" module, "error" controller, 
         * specifically, the "error" action.  These options are configurable, see 
         * {@link http://framework.zend.com/manual/en/zend.controller.plugins.html#zend.controller.plugins.standar
         *
         * @return void
         */
        public function errorAction()
        {
            $errors = $this->_getParam('error_handler');
            switch ($errors->type) { 
                case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
                case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                    // 404 error -- controller or action not found
                    $this->getResponse()->setHttpResponseCode(404);
                    $this->view->message = 'Page not found';
                    break;
                case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER:
                    switch (get_class($this->_exception->exception)) {
                        case 'Zend_View_Exception' :
                            $this->getResponse()->setHttpResponseCode(500);
                            $this->view->message = 'Erreur de traitement d\'une vue';
                            break;
                        case 'Zend_Db_Exception' :
                            $this->getResponse()->setHttpResponseCode(503);
                            $this->view->message = 'Erreur de traitement dans la base de données';
                            break;
                        case 'Metier_Exception' :
                            $this->getResponse()->setHttpResponseCode(200);
                            $this->view->message = $this->_exception->exception->getMessage();
                            break;
                        default:
                            $this->getResponse()->setHttpResponseCode(500);
                            $this->view->message = 'Erreur inconnue : '. $this->_exception->exception->getMessage();
                            break;
                    }
                break;
     
                default:
                    // application error 
                    $this->getResponse()->setHttpResponseCode(500);
                    $this->view->message = 'Application error';
                    break;
            }
     
            $this->view->exception = $errors->exception;
            $this->view->request   = $errors->request;
        }
     
    }
    ça marche pour les erreur NO_CONTROLLER et NO_ACTION, par contre je sais pas comment faire pour tomber dans le cas EXCEPTION_OTHER !

    par exemple dans mon BootStrap, j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    protected function _initDb(array $options = array())
        {
            $this->bootstrap('config');
            $config = $this->getResource('config');
            $db = Zend_Db::factory($config->resources->db);
            try
            {
                $db->getConnection();
            }
            catch(Zend_Db_Adapter_Exception $e)
            {
                die($e->getMessage());
            }
     
            Zend_Db_Table_Abstract::setDefaultAdapter($db);
            Zend_Registry::set( 'dbAdapter', $db );
            return $db;
        }
    mais à la place de faire un die(), j'aimerais bien pouvoir tombé sur mon controller error dans le cas 'Zend_Db_Exception';

  2. #2
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    essaye d'enlever le "try" dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected function _initDb(array $options = array())
        {
            $this->bootstrap('config');
            $config = $this->getResource('config');
            $db = Zend_Db::factory($config->resources->db);
     
            $db->getConnection();
     
            Zend_Db_Table_Abstract::setDefaultAdapter($db);
            Zend_Registry::set( 'dbAdapter', $db );
            return $db;
        }

  3. #3
    Membre éclairé Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Par défaut
    bah quand j'enleve le try, j'ai une erreur :
    Fatal error: Uncaught exception 'Zend_Db_Adapter_Mysqli_Exception' with message 'Access denied for user '*****'@'localhost' ....

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Pourquoi ouvrir la connexion à la base de données dans ton bootstrap ?
    Si l'utilisateur fait une requête qui ne nécessite pas de connexion à la base, tu en ouvres une pour rien...

    Et comme on n'est pas encore dans une boucle de dispatching, le plugin ErrorHandler ne joue pas son rôle, c'est pour ça que ton contrôleur d'erreur n'est pas utilisé.

    Si tu suppimes ton try AVEC la création de la connexion ($db->getConnection(); ), ça devrait aller mieux... (en tous cas, l'exception sera levée plus tard, et probablement récupérée par le gestionnaire d'erreur).

  5. #5
    darthmower
    Invité(e)
    Par défaut
    Salut,

    Si l'utilisateur fait une requête qui ne nécessite pas de connexion à la base, tu en ouvres une pour rien...
    Je ne sais pas pour lui mais moi par exemple, ma gestion d'Acl va chercher en base les règles, donc j'ai toujours besoin d'une connexion.

    As-tu vérifier ce que renvoie: get_class($this->_exception->exception), ou n'y arrives-tu jamais?

    Gripsou

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par darthmower Voir le message
    Je ne sais pas pour lui mais moi par exemple, ma gestion d'Acl va chercher en base les règles, donc j'ai toujours besoin d'une connexion.
    Ca ne change pas ma réponse.
    J'imagine que les Acl sont gérées dans un plugin ? Il est donc préférable de ne faire cette connexion à la BDD que le plus tard possible (par ce plugin), ce qui permettra à l'exception d'être gérée par le contrôleur Error...

    Et le jour où tu essaieras d'optimiser ton application en mettant des données en cache (comme les Acl), la connexion à la base de données ne sera ouverte que si elle est réellement indispensable...

  7. #7
    darthmower
    Invité(e)
    Par défaut
    Bonjour,

    Et le jour où tu essaieras d'optimiser ton application en mettant des données en cache (comme les Acl), la connexion à la base de données ne sera ouverte que si elle est réellement indispensable...
    Je plussoie totalement, j'ai d'ailleurs commencé à regarder, mais je ne vois pas bien ce que tu veux faire (lancer en gros un mysql_connect et mysql_close comme on le fait dans un site complètement maison avant et après tes requête?)

    Gripsou

  8. #8
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par darthmower Voir le message
    Je plussoie totalement, j'ai d'ailleurs commencé à regarder, mais je ne vois pas bien ce que tu veux faire (lancer en gros un mysql_connect et mysql_close comme on le fait dans un site complètement maison avant et après tes requête?)
    Non, non, je ne veux rien faire du tout

    Si tu n'ouvres pas la connexion à la base de données (en faisant un $db->getConnection(); ), cette connexion sera ouverte automatiquement dès qu'une requête sera soumise à la base de données. Il n'y a donc simplement pas besoin de se préoccuper de cette connexion. Il suffit de définir les paramètres de connexion à la BDD dans une ressource du bootstrap, et laisser le Zend Framework ouvrir cette connexion quand il en a besoin...

  9. #9
    darthmower
    Invité(e)
    Par défaut
    Salut,

    Si tu n'ouvres pas la connexion à la base de données (en faisant un $db->getConnection(); ), cette connexion sera ouverte automatiquement dès qu'une requête sera soumise à la base de données. Il n'y a donc simplement pas besoin de se préoccuper de cette connexion. Il suffit de définir les paramètres de connexion à la BDD dans une ressource du bootstrap, et laisser le Zend Framework ouvrir cette connexion quand il en a besoin...
    , vraiment merci, je ne savais pas du tout .

Discussions similaires

  1. Gestion des erreur avec aspSmartUpload
    Par zooffy dans le forum ASP
    Réponses: 2
    Dernier message: 07/12/2007, 09h39
  2. gestion des erreurs avec fichier .properties
    Par _momo dans le forum Struts 1
    Réponses: 2
    Dernier message: 20/08/2007, 14h05
  3. [J2EE/JSP] Gestion des erreurs avec une base SQL server 2005
    Par critok dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 30/04/2006, 16h57
  4. Gestion des erreurs avec setjump/longjump
    Par gege2061 dans le forum C
    Réponses: 1
    Dernier message: 05/02/2006, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo