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

Langage Perl Discussion :

En cas d'erreur, effectuer une ultime action


Sujet :

Langage Perl

  1. #1
    Membre à l'essai Avatar de myspanique
    Femme Profil pro
    Prof de maths + Stagiaire en informatique
    Inscrit en
    Octobre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prof de maths + Stagiaire en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 23
    Points : 17
    Points
    17
    Par défaut En cas d'erreur, effectuer une ultime action
    Bonjour,

    J'ai regardé la doc de warn et die, mais j'ai un peu de mal à comprendre concrètement la levée d'exceptions :
    je voudrais que mon programme effectue une toute dernière action en cas d'erreur avant de mourir.
    j'ai tenté des trucs du genre

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    fais_ton_truc() || {ultime_sursaut() ; die};

    mais il n'aime pas du tout.
    J'ai cru comprendre qu'il fallait passer par un eval{} ? Je ne sais pas vraiment ni ce que ça change, ni comment m'y prendre.

    des conseils?
    d'avance merci !

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Si la fonction fais-ton-truc() fais elle-même un die ou quelque chose d'équivalent, alors il faut effectivement la
    mettre dans un eval pour éviter que l'ensemble du programme sorte immédiatement en erreur. Qu'y a-t-il dans fais-ton-truc()?

  3. #3
    Membre à l'essai Avatar de myspanique
    Femme Profil pro
    Prof de maths + Stagiaire en informatique
    Inscrit en
    Octobre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prof de maths + Stagiaire en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Eh bien pour donner un peu de détails, fais-ton-truc() discute avec un port série.
    Si le port ne répond pas, mon processus meurt.
    Mais avant, j'aimerais qu'il supprime un fichier créé au lancement du processus...

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Un bloc de code (entre { }) qui lève une exception (appelle die), évalué dans une instruction eval va fonctionner comme un "try/catch".
    A la sortie de eval, la valeur de $@ contiendra le texte du die (undef si l'évaluation n'a pas levé d'exception).
    Voir : perldoc eval
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Pour donner un petit exemple à la ligne de commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $  perl -e 'eval {print "toto\n";
    >  die "je meurs \n";
    >  print "titi";
    > };
    >  print "$@ \n"; print "tutu" if $@;'
    toto
    je meurs
     
    tutu
    A priori, il suffit de remplacer la ligne "print "tutu" if $@;" par ce dont tu as besoin (si du moins j'ai bien compris le besoin).

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Attention lolo, dans ton exemple, le print "tutu" n'est pas exécuté car le print "$@" ne lève pas d'exception, et re-initialise donc $@ à undef.
    Pour que le try/catch fonctionne, il faut impérativement que l'instruction qui teste $@ suit immédiatement après l'instruction eval.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Membre à l'essai Avatar de myspanique
    Femme Profil pro
    Prof de maths + Stagiaire en informatique
    Inscrit en
    Octobre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prof de maths + Stagiaire en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    sauf que de mémoire le die après un ";" il aime pas trop, si?
    Je pars quelques jours en vacances, je m'y repenche à mon retour, mais déjà merci pour vos réponses !

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Attention lolo, dans ton exemple, le print "tutu" n'est pas exécuté car le print "$@" ne lève pas d'exception, et re-initialise donc $@ à undef.
    Ben si, il est bien exécuté, comme on le voit dans mon exemple à la ligne de commande...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    toto
    je meurs
     
    tutu
    Citation Envoyé par Philou67430 Voir le message
    Pour que le try/catch fonctionne, il faut impérativement que l'instruction qui teste $@ suit immédiatement après l'instruction eval.
    Je suis bien d'accord, mais je suppose que si tu écris une instruction avec modificateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "Carpe diem" if $flag
    la valeur de $flag est évaluée avant toute autre chose, et en particulier forcément avant le deuxième print. Et il semble que le premier print n'affecte pas $@. Mais j'avoue volontiers que je n'ai jamais trouvé cette construction très fiable, on a souvent des surprises et je tends à l'éviter.

    C'était juste un exemple simple à la ligne de commande, il semble fonctionner (ou alors j'ai loupé quelque chose).

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par myspanique Voir le message
    sauf que de mémoire le die après un ";" il aime pas trop, si?
    Pourquoi donc? Pas à ma connaissance en tout cas.

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je ne sais pas où j'ai les yeux ce moment, mais surement pas en face des orbites.
    Du coup, pour comprendre mon explication foireuse, je suis allé vérifier le mode d'affectation de $@ dans perldoc perlvar, et effectivement, il n'est réinitialisé qu'après un eval sans exception.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

Discussions similaires

  1. [Débutant] Effectuer une action en cas de non résultat à un SelectSingleNode
    Par Sperafico dans le forum VB.NET
    Réponses: 6
    Dernier message: 18/11/2013, 22h37
  2. Réponses: 10
    Dernier message: 17/05/2006, 19h55
  3. Lister un répertoire et effectuer une action
    Par ipeteivince dans le forum Windows
    Réponses: 2
    Dernier message: 11/03/2006, 18h37
  4. [VB6]Fermer une page de propriétés en cas d'erreur
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 03/01/2006, 11h31
  5. Réponses: 7
    Dernier message: 15/03/2005, 14h44

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