Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-12-2007 21:18:04

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

[ZF-1.0.2 Exception] Problème curieux sur un catch d'exception

Bonjour tout le monde,

Je rencontre un pb curieux (sans doute quelque chose m'échappe-t-il) sur les gestions d'exception, avec db_table. J'ai géré les exceptions  d'une manière standard, en dérivant les classes de base du ZF, sans problème particulier. Je dérivais les classes si nécessaire pour introduire de nouveaux traitements.

L'exception incriminée et la plus courante lors de mes utilisation est la PDOException /Zend/Db/Statement/Pdo.php (ligne 227) qui sur une détection d'une PDOException, jette une exception Zend_Db_Statement_Exception (Qui est une pure dérivation de la classe Exception PHP et dans laquelle j'ai introduit des traitements spécifiques...

Tout cela marche  parfaitement, sauf sans un cas incompréhensible, car en apparence identique aux autres dans le process d'exécution... Il s'agit d'assurer des insertions ou des updates de base de données.... schéma classique ....
try{
        .... insert ... ou update ... ou delete()...
        ... autre instruction...
        ....
}catch (Zend_Db_Statement_exception $a){
         .. recup message erreur et gestion du message par l'application
}
.... poursuite etc...

Ce schéma a toujours marché sans problème. Toutefois dans le cas concerné, je constate la chose suivante , sur une erreur d'Insert l'exception n'est capturée que si j'introduis un exit() (et seulement un exit) immédiatement après l'instruction BdD en défaut, comme ci-dessous...
try{
        .... insert ...   <= Instruction potentiellement en erreur
       exit();
        ... autre instruction...
        ....
}catch (Zend_Db_Statement_exception $a){
         .. recup message erreur et gestion du message par l'application
}

Ainsi si j'ai une erreur, grâce à l'exit() [qui en fait ne sort pas]  la capture se fait et je peux gérer mon message d'erreur. Autrement en présence d'erreur et en absence d'exit(), il n'y a pas de capture, l'exception est jetée sans que je puisse la gérer. Bien sûr avec l'exit() et en absence d'erreur, mon programme quitte après l'insertion... Ce qui n'est pas souhaitable.

Ce comportement se produit dans un contrôleur de CRUD, les exceptions fonctionnenet sur les actions Add (Insert) Edit (Update) Delete() et défaille sur une recopie d'enregistrement qui est en fait un Insert(). La seule différence dans cette action de recopie est que je lis initialement l'enregistrement source  par un $this->view->table->fetchrow ($where), je fais quelques traitements et je réinsère par un  $this->view->table->insert ($arraydata.).  Dans les trois autres cas, je ne fais que l'instruction d'insertion(), d'update() ou de de delete()
. Voilà le scénario, j'imagine que l'erreur est évidente mais personnellement, je ne la vois pas. Les exceptions sont jetées quand il y a par exemple violation de contraintes (telle que unicité d'un champ) ..

Si quelqu'un pouvait éclairer mon cerveau défaillant ce serait très aimable...

Merci à tous

Marcel

Dernière modification par mbariou (11-12-2007 05:01:55)

Hors ligne

 

#2 10-12-2007 22:32:37

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [ZF-1.0.2 Exception] Problème curieux sur un catch d'exception

Perso je vois pas trop de quoi t'aider, si ce n'est de regarder si y'a pas un truc qui permet de bien lancer les exceptions.
Du côté du Zend_Front_Controller (rien à voir à priori hein?) y'a un truc dans le genre

Code:

    $frontController->throwExceptions(true);

Et si jamais tu fais pas ça, les exceptions ne sont pas lancées. Peut être y'a t'il quelque chose de similaire dans ton cas... Peut être.

Hors ligne

 

#3 11-12-2007 05:00:25

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [ZF-1.0.2 Exception] Problème curieux sur un catch d'exception

Merci pour ta remarque, ce booléen autorise effectivement le jet d'exception. Mais il est positionné car sinon je ne pouvais voir les exceptions.

A+, je poursuis et je mets au courant dès que c'est trouvé, car c'est forcément une erreur de ma part.

Marcel

Hors ligne

 

#4 11-12-2007 10:32:38

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [ZF-1.0.2 Exception] Problème curieux sur un catch d'exception

Ca me parraît effectivement très louche. Tu peux nous envoyer la ligne ".... insert ... ou update ... ou delete()..." ?

tu utilises quelle version de PHP ?

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#5 11-12-2007 10:54:46

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [ZF-1.0.2 Exception] Problème curieux sur un catch d'exception

philippe a écrit:

Ca me parraît effectivement très louche. Tu peux nous envoyer la ligne ".... insert ... ou update ... ou delete()..." ?

tu utilises quelle version de PHP ?

A+, Philippe

Sous Fedora 7 / php 5.2.2 (RECOMPILÉ PAR MES SOINS) Tout cela marche correctement.

Il s'agit d'exception dans un contrôleur :

1 => Celui-ci fonctionne correctement  dans un action Edit, il y en a un presque pareil dans un action Add:

Code:

    try{
        $where = $pkTable.' = ' . $_POST[$pkTable];                    
        $this->view->dataMap->update($this->array_name, $where);
        
        if(isset($this->postEditAction) && $this->postEditAction !=''){
            $helper=$this->postEditAction;
            $this->$helper($_POST[$pkTable]);
        }
        
        if($this->process['index_return']=='/'){
            $this->_redirect($this->process['index_return']);
        }else{
            $this->_redirect($this->process['index_return'].'idx/'.$_POST[$pkTable].'/');
        }
        return;
    }catch (Zend_Db_Statement_Exception $e) {
        $this->view->dataMap->setErrorMsg($e->getError());
    }

2 => Par contre l'objet de tous mes soucis est le suivant, je vous passe l'action entière :

Code:

    /**
    *    Copy an instance of an existing record into the database
    *    recordID copy
    *
    *    @var Crud_Core Papweb 2.0
    */
    
    public function copyRecordAction()
    {
        $field_keys=array_keys($this->array_name);
        $pkTable=$this->tb_name.'ID';        
        $tTableID = (int)$this->_request->getParam($pkTable, 0);
        if ($tTableID > 0) {
            $this->view->tTable = $this->view->dataMap->fetchRow($pkTable.'='.$tTableID);
        }
        $rowData=$this->view->tTable->getRowData();
        foreach($rowData as $index => $value){
            switch($index){
            case $field_keys[0] :
            case 'c_username' :
            case 'email' :
            case 'password' :
                $array_data[$index]='To Update';
            break;
            case 'c_name' :
            case 'c_fname' :
            case 'c_lastname' :
            case 'c_title' :
                $array_data[$index]=$this->view->translator->_('AA To Update');
            break;
            default:
                $array_data[$index]=$value;
            break;                
            }                
        }
    
    try{
            $this->view->dataMap->insert($array_data);
            } catch (Zend_Db_Statement_Exception $ee) {

            $this->view->dataMap->setErrorMsg($ee->getError());                    
        } 

        $this->view->dataMap->set_wheregrid('');
        $this->view->dataMap->set_PathUrl($this->process);
        $this->view->grid= $this->view->dataMap->frontgridAction();

        //$this->_redirect($this->process['index_return']);
        //return;

    }

Dans ce copyRecord, à la différence des autres je fais deux accès en Database.
Je m'interroge sur PDO qu'est-ce qui peut masquer une exception ?
Merci pour l'aide...

Marcel

Dernière modification par mbariou (12-12-2007 11:21:30)

Hors ligne

 

#6 11-12-2007 13:50:51

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: [ZF-1.0.2 Exception] Problème curieux sur un catch d'exception

A tout hasard, essai d'ajouter un catch d'exception plus générique "catch (Exception $e)" des fois que tu choppes une exception autre que db_statement...
mais ca explique difficilement le coup du exit...

Hors ligne

 

#7 11-12-2007 17:56:32

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [ZF-1.0.2 Exception] Problème curieux sur un catch d'exception

oui Capture des exception très générique et affiche là tu dois voir alors son type
print_r($e);

tu peux mettre plusieurs catch dans un try

Code:

    try{
 .... mon code        
    }
    catch (Zend_Db_Statement_Exception $e) {
        erreur statment
    }
    catch (Zend_Db_Exception $e) {
        erreur database
    }
    catch (Zend_Exception $e) {
        erreur autre
    }

Hors ligne

 

#8 12-12-2007 09:07:43

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [ZF-1.0.2 Exception] Problème curieux sur un catch d'exception

Bonjour,

Merci pour vos suggestions, sans les imbriquer j'avais essayé une à une des tentatives de capture d'exception de nature différente => rien,  j'ai fait cette imbrication comme vous me le recommandez  pareil => La même exception est jetée =>

Zend_Db_Statement_Exception: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'To Update' for key 2 in /etc/httpd/lib/php/lib_zdf/Zend/Db/Statement/Pdo.php on line 227

Et vous remarquerez comme moi que c'est une exception de type Zend_Db_Statement_Exception ....

Je mets un exit() et c'est bon je gère le message d'exception cf. ci-après :

Gestion des utilisateurs => liste
Erreur de frappe ou de syntaxe en entrée SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'To Update' for key 2

C'est comme si un processus en cours masquait un autre.

As-ton accès facilement à la pile des exceptions, seriez-vous me dire cela ?

Par ailleurs, au lieu d'extraire les données de la base pour recopie, je vais créer un tableau ou je simulerai  les erreurs, ceci me conduira à un seul accès base  dans l'action Recopy  et je vous tiens au courant .

Néanmoins merci pour votre aide  et A+

Marcel

Dernière modification par mbariou (12-12-2007 10:12:40)

Hors ligne

 

#9 12-12-2007 11:48:43

mbariou
Membre
Lieu: Palaiseau France
Date d'inscription: 09-06-2007
Messages: 40
Site web

Re: [ZF-1.0.2 Exception] Problème curieux sur un catch d'exception

J'ai fait les essais que je proposais et ça ne change rien au problème. Car il est ailleurs.

En effet, vous constaterez à la fin de chaque try{} j'introduis un return; Je ne l'introduisais pas ici (Oubli) car j'avais fait cela il y a quelques mois (Sur add, edit, delete) et je voulais simplement gérer en plus  l'exception à ce jour sur la recopie.

Ce return, présent dans les "try", nécessaire au bon fonctionnement était le fruit d'une succession de tentatitves à l'époque. Je ne m'étais pas fondamentalement rendu compte de sa nécessité, qui est avérée aujourd'hui... Je l'ai donc introduit dans le try/catch de la recopie et c'est ok.

Maintenant cette nécessité est certainement due à une mauvaise gestion de ma part de la vue. Mais je ne sais où, car en doute modestie, je n'ai pas trop cherché à comprendre. Pour ma part j'utilise une vielle librairie de template très simple issue de la PHPLIB, présente dans PEAR. Elle à l'avantage, à mes yeux, d'être du VIEW canonnique (pas de logique à l'intérieur rien) du pur visuel pouvant être remis à un graphiste en l'état.

Sans doute, faute de compréhension de ma part, n'ai-je pas bien dévalidé le renderer/view propre au ZF, d'où cette nécessité du return (simple hypothèse de ma part).

Toujours est-il que de mon côté cela fonctionne, sans être nécéssairement optimum en terme de View et surtout d'occupation mémoire, car il y a certainement des objets du ZF non utilisés qui trainent .... Car je consate que les objets en mémoire sont assez conséquents...

Par ailleurs j'ai écrit une application assez complète avec le ZF, il serait certainement pertinent d'en faire un tuto. Le faire seul, je crains faire faire certaines impasses. Si d'aventure certains peuvent être intéressés, on peut en discuter...

Merci

Dernière modification par mbariou (12-12-2007 11:51:36)

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