Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1067 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  eviter de faire planter mon script en cas d'erreur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

eviter de faire planter mon script en cas d'erreur

n°1865098
donny3
Posté le 24-03-2009 à 09:46:42  profilanswer
 

Salut,
 
Voici mes problèmes,
j'ai un script qui se connecte à une base de donnée comme ceci
 

Code :
  1. my $dbh = DBI->connect("dbi:Oracle:$db", $user, $pass) or
  2. die "Database connection not made: $DBI::errstr";


 
si jamais il n'arrive pas à se connecter , il plante et affiche une erreur sur le prompt si je suis connecter, sinon il n'affiche aucune erreur dans la log.
Ce que je voudrais est que si il n'arrive pas a se connecter, alors je ne sors pas en erreur , mais je retente. EN quelque sorte je veux que le script ne bogue jamais.
 
Pareil, dans mon script,je fais des requetes

Code :
  1. my $sth=$dbh->prepare($query);
  2. $sth->execute();


 
s'il n'arrive pas a executer la requête a cause d'une deconnexion ou quoi que ce soit,
je ne veux pas qu'il plante mais qu'il continu la suite du script voir qu'il essai de se reconencter.
 
Est-ce possible ?
 
Merci

mood
Publicité
Posté le 24-03-2009 à 09:46:42  profilanswer
 

n°1865106
gilou
Modérateur
Modzilla
Posté le 24-03-2009 à 10:04:33  profilanswer
 

Et si tu allais voir la doc de DBI? qui indique très bien la valeur de retour en cas d'échec d'un connect.
Quand on fait
or die "Database connection not made: $DBI::errstr";
il ne faut pas être étonné que ca plante en écrivant quelque chose a la console.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1865179
donny3
Posté le 24-03-2009 à 10:46:59  profilanswer
 

j'ai regarder et je vois pas grand chose,
par contre je viens de tester un truc, j'ai enlever le die
et je lance mon script et il plante quand meme et m'affiche l erreur :
failed: ORA-01017: invalid username/password; logon denied (DBD  
sur le shell et bloque.

n°1865186
donny3
Posté le 24-03-2009 à 10:53:36  profilanswer
 

j'ai essayer de recuperer l'erreur en ajoutant cela
my $erreur = $dbh->errstr;
et je teste ensuite si $erreur est vide,
mais le hic c'est qu'il m'affiche le message d'erreur avant et plante ensuite;du coup $erreur n'est jamais renseigné

n°1865202
gilou
Modérateur
Modzilla
Posté le 24-03-2009 à 11:14:56  profilanswer
 

Elle est pourtant claire, la doc: http://search.cpan.org/~timb/DBI/DBI.pm#connect

Citation :

If the connect fails (see below), it returns undef and sets both $DBI::err and $DBI::errstr. (It does not explicitly set $!.) You should generally test the return status of connect and print $DBI::errstr if it has failed.


Citation :

et je lance mon script et il plante quand meme et m'affiche l erreur :
failed: ORA-01017: invalid username/password; logon denied (DBD  
sur le shell et bloque.

Eh bien maintenant tu sais pourquoi il ne se connecte pas, et c'est à toi de faire le necessaire. Parce que si tu refais la connection 25 fois de suite, ca servira a rien, sauf a avoir 25 fois cette erreur. Je ne sais pas les valeurs que tu as mis dans $user et $pass mais clairement ce ne sont pas les bonnes.
Faudra d'ailleurs que tu m'expliques a quoi peut bien te servir de lancer la suite du script apres un echec du connect.
A+,


Message édité par gilou le 24-03-2009 à 11:16:55

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1865205
donny3
Posté le 24-03-2009 à 11:22:49  profilanswer
 

l'erreur de connexion, elle ait volonaire, c'est pour faire mon test;
moi ce que je souhaite faire c'est si jamais il n'arrive pas a se connecter, je recupere le coderetour, je vois que c'est du a cela et a ce moment, je réessai de me connecter, jusqu'à qu'il arrive à se connecter.
La problème est que je récupere,je souhaite recuperer l'erreur mais avec $dbh->err, ça ne fonctionne pas.

n°1865211
couak
Posté le 24-03-2009 à 11:39:08  profilanswer
 

le code retour tu l'as, ca a été donné par gilou : ca retourne undef
récupérer l'erreur, tu l'avais fais dans ton permier post, il faut utiliser $DBI::errstr
réessayer une connexion à l'infini, c'est crade
 
maintenant à mon tour de poser des questions : est ce que tu comprends réellement le code que tu écris ?

n°1865218
donny3
Posté le 24-03-2009 à 11:59:03  profilanswer
 

oui je le comprends,
ce qui m'as induit en erreur c'est le site du cpan qui disait d'utiliser ça :$dbh->errstr
en faite quand j'y reflechi bien j'avais la solution devant les yeux et ce qui faisait planter mon script c'etait le die;
en le supprimant et testant que $DBI::errstr ou $DBI::err est vide pour savoir que la connexion c'est bien passé, je résou mon problème.
 
Après ressayer une connexion à l'infini , euh c est crade ?je pense pas.
Imagine il y a un problème réseau, d'accès à la base, ou est le probleme?
je boucle à l'infini jusqu'à qu'il se connecte

n°1865219
couak
Posté le 24-03-2009 à 12:04:22  profilanswer
 

et imagine si le mot de passe change : si le DBA a mis en place l'expiration du compte lorsque trop de mot de passe sont mal saisis tu vérouilles le user et tu peux créer un problème de production
 
imaginons que ton application est déployé sur 10.000 clients et que ces 10.000 clients s'amusent à spammer le listener oracle, que va-t-il se passer ?
 
enfin bref ce sont des allusions de développeur qui essaie de penser à la place de l'administrateur, si tu veux vraiment rendre ton truc robuste, tu permets de faire X essais (mais pas à l'infini) et tu mets un temps de polling, le tout paramétrable

n°1865237
donny3
Posté le 24-03-2009 à 12:56:11  profilanswer
 

je pourrai faire cela, mais le dba ne changera pas le mot de passe, c'est moi qui gère ce schémas oracle.
Donc il n'y aura jamais d'erreur de mot de passe ou user, la seule erreur que je redoute,c'est qu'il y ait un problème de reseau que je ne peux me connecter.
Je pourrai faire un truc au bout de x essai mais le problème, est que je lance le truc le soir donc meme si j'envoi un mail ou quoi que ce soit,personne ne pourra intervenir.
C'est pour ça que je veux boucler et le faire retenter une connexion si jamais sa echoue.
 
Par contre, j'ai une question, si jamais il se connecte et qu'ensuite au moment ou il lance la requete, qu'il fait le execute, la connexion , est perdu,cela veut dire que mon script va planter.
Je peux tester qu'il n'arrive pas a lancer la requete avec le $DBI::errstr , par contre si je veux faire une reprise, ça se passe comment ??
je suis obliger de dire a mon script de retenter la connexion, c'est à dire de remonter en haut du script avec un go to ??(ça fait crade de faire sa, a la rigueur tester la connexion et la relancer si elle plante, mais tester une requete qui plante et se reconnecter c est pas propre)

mood
Publicité
Posté le 24-03-2009 à 12:56:11  profilanswer
 

n°1865239
donny3
Posté le 24-03-2009 à 12:59:55  profilanswer
 

non, je viens de penser à un truc,je met tout dans une boucle.
apres le execute, je recupere le $DBI::errstr.
Je test si il est vide, si c'est pas le cas j'initialise un boolean.
Quand je boucle pour la deuxieme fois, si mon boolean est a true alors,je me reconnecte à la base.

n°1865242
gilou
Modérateur
Modzilla
Posté le 24-03-2009 à 13:06:46  profilanswer
 

Citation :

je boucle à l'infini jusqu'à qu'il se connecte


Surtout pas.
Je te donne une idée d'algo (telle que utilisée en réseaux).
D'abord, tu te donnes un temps maximal de déconnexion au bout duquel tu considères que c'est fichu et que tu arrêtes le programme. on va l'appeler DECON_MAX :whistle:  
Ensuite tu te donnes un intervalle minimum avant de refaire un essai, DECON_MIN.
Tu essayes de te connecter. Si ça échoue, tant que le délai  DECON_MAX n'est pas atteint, tu essayes de te reconnecter de la manière suivante:
entre chaque tentative de connexion, tu laisse passer un délai de 2^k * DECON_MIN pour la k-ième tentative de connexion (c'est a dire que tu attends DECON_MIN avant de te reconnecter, puis 2 * DECON_MIN, puis 4 * DECON_MIN etc, bref tu doubles le temps avant chaque tentative a chaque essai)
 
[apres, on peut faire des variantes sur cet algo, mais la, ça donne l'idée de base]
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1865251
donny3
Posté le 24-03-2009 à 13:22:28  profilanswer
 

mon algo va fonctionner comme ça, avant de tenter une reconnection, je vais faire un sleep;
mais sur le fait que je dois boucler a l infini tant qu'il ne se connecte pas,et ne pas sortir au bout de n essai, je suis obliger de faire comme cela, on me l 'impose.

n°1865316
donny3
Posté le 24-03-2009 à 14:19:51  profilanswer
 

j'ai trouver ce lien , il est pas mal
http://www.t-scripts.com/perl/
du coup si je veux blinder mon truc , faut que test le prepare et le execute et le finish .....
mais le problème est que comme j'ai une boucle,
si mon script plante au prepare, il ne pourra pas faire le execute() du coup , je vais sortir de mon script en erreur et je ne veux pas cela.
Existerait il une solution , pour que mon script remonte ou aille a la fin de ma boucle en ignorant , le reste de code :
 
 
j'ai peut être trouver, du coté du next


Message édité par donny3 le 24-03-2009 à 14:26:51
n°1865319
donny3
Posté le 24-03-2009 à 14:29:08  profilanswer
 

ça à l'air de marché, c'est puissant le perl!!!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  eviter de faire planter mon script en cas d'erreur

 

Sujets relatifs
Script shell pour récupèrer des images sur une cameraErreur de type Warning: mysql_fetch_array()
vbs script recherche User sous-domaineScript redirection mail Outlook
Script VBS + message d'attente[résolu][C] Strlen - erreur de segmentation
erreur 404 et probléme "methode GET"[Windows/Visual C++] Erreur de link "GetTime et KillTimer"...
Eviter le timeout en actualisantscript sous server 2003
Plus de sujets relatifs à : eviter de faire planter mon script en cas d'erreur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR