perl - protéger un programme contre les plantages ?

perl - protéger un programme contre les plantages ? - Perl - Programmation

Marsh Posté le 17-04-2003 à 02:40:35    

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.

Reply

Marsh Posté le 17-04-2003 à 02:40:35   

Reply

Marsh Posté le 17-04-2003 à 07:29:39    

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

Reply

Marsh Posté le 17-04-2003 à 08:12:58    

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. }

Reply

Marsh Posté le 20-04-2003 à 12:58:16    

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
Reply

Marsh Posté le 20-04-2003 à 13:41:33    

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

Reply

Marsh Posté le 20-04-2003 à 15:28:45    

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...

Reply

Marsh Posté le 15-05-2003 à 12:45:47    

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 ?

Reply

Sujets relatifs:

Leave a Replay

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