[PHP] try catch imbriqués.

try catch imbriqués. [PHP] - PHP - Programmation

Marsh Posté le 11-06-2010 à 16:14:15    

Salut,
 
J'ai une question sur l'utilisation de try catch imbriqués lors d'opération PDO sur une bdd.  
Le code est schématique mais le principe est là:
 

Code :
  1. try{
  2.       //insertion PDO dans la table1;
  3.       $table1->insert($args);
  4.       $lastid=$db->lastInsertId();
  5.       try{
  6.             //update PDO dans la table 1
  7.             //update PDO dans la table 2
  8.       }
  9.       catch(Exception $e){
  10.             //CODE ERREUR2: erreur de l'update d'une(ou des deux) table 1/2
  11.             $table1->delete($lastid);
  12.             echo 'Une erreur 2 s\'est produite';
  13.       }
  14. }
  15. catch(Exception $e){
  16.       //CODE ERREUR1: Une erreur s'est produite lors de l'insertion dans la table 1
  17.       echo 'Une erreur 1 s\'est produite';
  18. }


 
 
L'idée est d'effectuer des opérations dépendantes entre-elles (une opération ne peut s'effectuer que si la précédent s'est bien déroulée) sur une bdd sans arrêt en cas d'erreur à l'une d'elles et avec la possibilité de déterminer quelle opération à lancé l'exception;  
 
Voila, je cherche à savoir si mon pseudo-code n'est pas bon, alors quelle est la bonne méthode, sachant que mon pseudo code représente deux imbrications mais qu'il peut y en avoir plus...
 
Merci à tous.
 :jap:


Message édité par durk le 11-06-2010 à 16:18:00
Reply

Marsh Posté le 11-06-2010 à 16:14:15   

Reply

Marsh Posté le 11-06-2010 à 16:19:35    

je ferai un truc comme ça

Code :
  1. begintransaction();
  2. try{
  3. $table1->insert($args);
  4. $lastid=$db->lastInsertId();
  5. }catch(){
  6.  
  7. //CODE ERREUR1: Une erreur s'est produite lors de l'insertion dans la table 1
  8. echo 'Une erreur 1 s\'est produite';
  9. rollback()
  10. return ;
  11.  
  12. }
  13. try{
  14.     //update PDO dans la table 1
  15.     //update PDO dans la table 2
  16. }catch(){
  17. //CODE ERREUR2: erreur de l'update d'une(ou des deux) table 2
  18.     echo 'Une erreur 2 s\'est produite';
  19. rollback() //il se charge de l'effacement necessaire
  20. }
  21.  
  22. commit()

Message cité 1 fois
Message édité par flo850 le 11-06-2010 à 16:19:46
Reply

Marsh Posté le 11-06-2010 à 16:24:58    

flo850 a écrit :

je ferai un truc comme ça  
[code = php] [/ code]


J'ai eu la même idée, mais le problème, c'est qu'en cas d'erreur lors du premier try, on se tapera quand même le deuxième, qui n'a pas lieu d'être exécuté...


Message édité par Pascal le nain le 11-06-2010 à 16:25:27
Reply

Marsh Posté le 11-06-2010 à 16:32:38    

il ya un return dans le catch ;)

Reply

Marsh Posté le 11-06-2010 à 16:33:26    

mais sinon, je fusionnerai , les deux
rollback se chargera de remettre tout en etat en cas de problème


Message édité par flo850 le 11-06-2010 à 16:33:34
Reply

Marsh Posté le 11-06-2010 à 16:34:22    

pour la gestion des erreurs de PDO y'a plus simple que de faire des try...catch partout
 
http://php.net/manual/fr/pdo.error-handling.php

Reply

Marsh Posté le 11-06-2010 à 16:37:08    

Slt, tout d'abord merci de t'intéresser à mon pb.
 
En suite, dis moi si je me trompe mais ton code risque d'exécuter les updates même en cas d'erreur du premier try catch, ce qui fausserait le resultat puisque le dernier id insérer ne correspondrait à ce qu'il serait en cas d'insert reussit.
 
EDIT: ouh, c'est allé vite.. j'avais pas fait gaf non plus au return... je regarde je tiens au courant.


Message édité par durk le 11-06-2010 à 16:38:55
Reply

Marsh Posté le 11-06-2010 à 16:57:07    

Re.  
 
En fait je connais le lien mais je ne vois pas comment gérer les erreurs sans interrompre le code d'une meilleurs façon qu'avec les exceptions. Peux-tu détailler ?
 
Si non, le rollback me parait un bon plan. confirmation: le return renvoie où? pq l'idée est de ne pas sortir du script...
 
edit.
 
Peut-être une solution serait de reprendre ton script (flo850) mais d'instencier l'exception et de vérifier par la suite si elle est unset ou pas si non, alors on effectue le deuxième try catch.


Message édité par durk le 11-06-2010 à 17:05:41
Reply

Marsh Posté le 11-06-2010 à 17:16:31    

en PDO::ERRMODE_WARNING ca s'arrête pas

Reply

Marsh Posté le 11-06-2010 à 17:18:37    

mieux :

Code :
  1. begintransaction();
  2. try{
  3. $table1->insert($args);
  4. $lastid=$db->lastInsertId();
  5.     //update PDO dans la table 1
  6.     //update PDO dans la table 2
  7. }catch(){
  8. rollback() //il se charge de l'effacement necessaire
  9. }
  10.  
  11. commit()


Message édité par flo850 le 11-06-2010 à 17:20:03
Reply

Marsh Posté le 11-06-2010 à 17:18:37   

Reply

Marsh Posté le 11-06-2010 à 17:26:56    

yep, c'est ce que j'ai fait en re-regardant la doc de begintransaction/rollback/commit j'ai vu qu'on revenait à l'état d'avant; donc qu'il y ait eu une erreur ou dix, la bdd n'est pas modifiée.  
Ce qui fait même gagner en temps d'exécution puisqu'on ne modifie la bdd qu'en étant sûr de pas revenir sur les modifications.
 
Merci à tous ça m'a bien aidé.
 :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed