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

  FORUM HardWare.fr
  Programmation
  Perl

  perl - protéger un programme contre les plantages ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

perl - protéger un programme contre les plantages ?

n°364169
Ethan_cart​er
Posté le 17-04-2003 à 02:40:35  profilanswer
 

Bonjour,
 
j'ai programmé un script, en perl, avec notamment la connesion à une base de données mysql.
 
Le programme fonctionne trés bien.
 
Malgré tout, je souhaiterais qu'une portion de code (un sous-programme) soit protégée... je veux dire à perl : si ce sous-programme déconne, ou est trop lent, ou s'il y a le moindre problème, tu oublie ce sous-programme et tu passes à autre chose...sans me faire une erreur 500 ou sans abandonner le programme par un exit prématuré.
 
je pense qu'il faut utiliser eval. Mais je ne connais pas sa syntaxe. Et je voudrais savoir s'il n'y a pas mieux.
 
 
Merci d'avance.

mood
Publicité
Posté le 17-04-2003 à 02:40:35  profilanswer
 

n°364188
phoenix35
Posté le 17-04-2003 à 07:29:39  profilanswer
 

Ethan_Carter a écrit :

Bonjour,
 
j'ai programmé un script, en perl, avec notamment la connesion à une base de données mysql.
 
Le programme fonctionne trés bien.
 
Malgré tout, je souhaiterais qu'une portion de code (un sous-programme) soit protégée... je veux dire à perl : si ce sous-programme déconne, ou est trop lent, ou s'il y a le moindre problème, tu oublie ce sous-programme et tu passes à autre chose...sans me faire une erreur 500 ou sans abandonner le programme par un exit prématuré.
 
je pense qu'il faut utiliser eval. Mais je ne connais pas sa syntaxe. Et je voudrais savoir s'il n'y a pas mieux.
 
 
Merci d'avance.


 
Eval est la fonction dont tu as besoin. Pour la syntaxe, perldoc -f eval

n°364200
Aricoh
gentil mais fo po pousser
Posté le 17-04-2003 à 08:12:58  profilanswer
 

exemple avec eval :
 

Code :
  1. eval {
  2.     ton bout de code à tester ici;
  3. };
  4. if ($@) {
  5.     print "eval a retourne une erreur : $@\n";
  6. } else {
  7.     ca_roule;
  8. }

n°367484
pospos
Posté le 20-04-2003 à 12:58:16  profilanswer
 

Aricoh a écrit :

exemple avec eval :
 

Code :
  1. eval {
  2.     ton bout de code à tester ici;
  3. };
  4. if ($@) {
  5.     print "eval a retourne une erreur : $@\n";
  6. } else {
  7.     ca_roule;
  8. }




 
 
et pour eviter que le code ne soit trop lent on peut ajouter un alarm (mais je suis pas sur que ca marche sous windows):
 

Code :
  1. $SIG{ALRM} = sub {die "TIMED OUT"};
  2. my $timeOut = 60; # 60 secondes pour le time out
  3. eval {
  4.     alarm ($timeOut);
  5.     ton bout de code à tester ici;
  6.     alarm (0); # annulation de l'alarm si tout est ok
  7. };
  8. if ($@) {
  9.     # le eval a échoué
  10.     if ($@ =~ /TIMED OUT/) {
  11.         warn "eval etait trop lent: $@\n";
  12.     } else {
  13.         alarm(0); # on annule l'alarm car il n'y a pas eu de time out   
  14.         warn "eval a retourne une erreur : $@\n";
  15.     }
  16. } else {
  17.     ca_roule;
  18. }


Message édité par pospos le 20-04-2003 à 13:06:21
n°367495
Aricoh
gentil mais fo po pousser
Posté le 20-04-2003 à 13:41:33  profilanswer
 

je ne suis pas sûr qu'alarm fonctionne sous Windows
 
par contre, le package BDD-Mysql fourni des méthodes pour se prémunir contre les erreurs signalées par MySql, y compris (je crois) un truc sur les time out

n°367514
pospos
Posté le 20-04-2003 à 15:28:45  profilanswer
 

ouai effectivement il je pense que ca marche pas sous windows...
ben le mieux dans ce cas, si les fonctions de dbd ne suiffisent pas (je les connais pas), c'est de forker un child et de voir ou il en est, ou un thread si tu a perl 5.8
Ou alors, si c'est pas des instructions bloquantes tu peux faire ca a coup de tk::task et de after sous tk...

n°394929
Ethan_cart​er
Posté le 15-05-2003 à 12:45:47  profilanswer
 

Salut,
 
Oui, merci pour le eval {}; en fait, ça ne fonctionnait pas chez moi car j'oubliais le ; à la fin.
 
En fin de compte, et vue qu'il s'agit d'un CGI, j'en ai fait un javascript, c'est à dire qu'à la fin de mon programme perl, j'ai mis un print qq~document.writte()~; et que j'appelle le programme comme un javascript. Comme ça si ça plante, le reste du site continue de fonctionner.
 
Je suis étonné qu'une erreur de programmation fasse quand même planter la boucle eval {}; je pensais que j'aurais eu un message d'avertissement mais ce n'est pas le cas...je suppose que c'est normal ?


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

  perl - protéger un programme contre les plantages ?

 

Sujets relatifs
Erreurs lors du lancement d'un programme GTKbug dans mon programme vb.net besoin d'aide ( resolu)
Pour ou contre une sous-catégorie [DROIT] ?[ Perl] cmd sort
Erreur lors de l'execution d'un programme en JavaPB de path en perl
[PERL] Couleurs à l'affichagelancer un programme sur la machine client
[php ou perl] petite bd dans 1 fichierTestez mon petit programme sous différent OS
Plus de sujets relatifs à : perl - protéger un programme contre les plantages ?


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