IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

robustesse, gestion des exceptions ? (Error.pm, Fatal.pm)


Sujet :

Modules Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Par défaut robustesse, gestion des exceptions ? (Error.pm, Fatal.pm)
    voilà, j'utilise NET::FTP pour faire du téléchargement de masse avec traitement derrière. j'ai eu cette erreur :
    Timeout at c:/Perl/lib/Net/FTP.pm line 503
    qui correspond à
    last unless $len=$data->read($buf,$blksize)
    bref... c'est assez ennuyeux que le script s'arrête brutalement en killant les threads qui sont derrière, en ne finissant pas les logs comme il faut...
    je me demandais si il n'y a pas un moyen de catcher les erreurs comme par exemple la gestion des exceptions en Java. Je viens de voir qu'il existait Error.pm ou même Fatal.pm qui semblent gérer les exceptions. Je n'ai pas trouvé beaucoup de doc dessus, ça semble assez récent et peut être pas vraiment abouti...
    quelqu'un a-t'il déjà utilisé les Exceptions en perl ?
    que puis je faire pour éviter mon problème de TimeOut ? suis je obligé de modifier la source du problème (FTP.pm) en levant des exceptions (throw) ou puis je catcher directement les "problemes" avec un use Fatal.pm ?
    merci de me faire partager votre expérience
    ++

    PS : lorsque l'on a plusieurs Threads est ce que si un d'eux gère un problème cela ne perturbe pas trop les autres ?

    PS2 (pas la console ) : j'ai pas trouvé la liste des exceptions de base... si quelqu'un a le lien...

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    normalement l'errur que tu decrit doit venir d'un 'die "Timeout"' ou 'croak "Timeout"' et non simplement d'un last.

    Pour catcher les erreur en perl on utilise eval {} (la versions avec des acollades, pas celles avec des guillemets de preference)
    c'est un peu l'equivalent d'un try:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    eval {
        1==0 || die "erreur";
    };
    et ensuite tu peux faire ton catch en testant la variable $@, qui contiendra l'erreur (en string) si erreur il y a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    eval {
        1==0 || die "erreur";
    };
    if ($@) {
        print "erreur catch: $@\n"
    }

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    juste en passant: les thread en perl (j'espere que tu parle de "use threads" et non de "use Thread", l'ancienne implementation de perl 5.5) sont encore assez instable et peu efficace au niveau de la gestion memoire.
    Suivant ce que tu a a faire, c'est parfois mieux de tout faire en une seule thread (avec des trucs genre POE ou Event) ou carrement en multiprocess (fork à l'ancienne, avec finalement une meilleure gestion memoire assurée par le copy on write de l'os) si tu n'est pas sous windows (sous windows forks est émulé par perl avec des thread de toute facon...)

  4. #4
    Membre confirmé

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Par défaut
    yop, merci pour ta réponse.
    - je connais pas 'croak', j'vais aller look ça.
    dans FTP.pm il n'y a pas /[die|croak] Timeout/ mais des appels vers Socket::INET et autre. est ce que le pb peut remonter à un autre module sans que j'en soit averti par le message d'erreur ?

    - est il possible de catcher une erreur qui vient d'un objet utilisé ? par ex en le protégeant à chaque fois qu'on l'utilise ?
    avec la methode eval{}; je ne pense pas que l'on puisse avoir un $@ au niveau "au dessus".. je suis peut être très clair, j'espère vous voyez ce que je veux dire

    - j'ai réussi à trouvé un ptit topo pas mal mais incomplet à mon gout (cf ici)
    la méthode eval{};if($@){} semble un peu dépassée et à remplacer par ça :
    use Error qw(:try);
    use Fatal qw(open);

    my $file='none';
    try {
    open(FH,$file);
    my $lol=<FH>;
    }
    catch Error with {
    print "$file n'existe pas...\n";
    }
    finally{
    print "J'suis dans finally :p\n";
    };
    print "Je fini normalement ^^\n";
    exit 0;
    la methode throw est aussi accessible pour lever des exeptions au lieu de retourner des message d'erreurs. Vivement les new versions avec que des levage d'exeption partout !!!

    bon si kelk1 a des réponses ou plus d'infos je suis preneur
    ++

  5. #5
    Membre confirmé

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Par défaut
    pour les threads, j'utilise ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    use Config; # le module Thread est il compilé ?
    $Config{useithreads} or die "Recompilez Perl avec les threads activés pour faire tourner ce programme.";     
    use threads; # Utilisation des threads
    use threads::shared; # Partager une variable avec les autres threads
    use Thread::Queue; # FIFO (nickel pour répartir le boulot entre les threads)
    use Thread::Semaphore; # pour locker une resource ;)

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    pour ta premiere question, oui c'est le read qui fait un die

    le coup du eval/test est la methode classique de gestion des exeptions en perl, mais effectivement elle n'est pas idéal puisqu'elle te retourne un string et non un objet d'erreur.
    Le module Error est idéal pour ce que tu veux faire effectivement.
    Par contre Fata c'est un peu autre chose: c'est un pragam (enfin une sorte de pragma...) qui force certaines fonctions syteme à faire un die (==exeption) au lieu de simplement renvoier false en cas d'erreur.
    En clair si tu fais un use Fatal 'open', tu n'as pas plus à tester la valeur de retour des open, et un simple open devient equivalent à un open || die;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. gestion des exceptions via <error-page>
    Par mrjeronimo dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 16/08/2010, 13h26
  2. [ORACLE 9i] Gestion des exceptions
    Par sygale dans le forum SQL
    Réponses: 6
    Dernier message: 19/08/2004, 15h06
  3. Gestion des exception (EOleException)
    Par shurized dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/06/2004, 17h25
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo