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

Scripts/Batch Discussion :

Question Try/Catch et Invoke-Command


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut Question Try/Catch et Invoke-Command
    Hello,

    J'aurais besoin de vos lumières concernant le comportement de try/catch dans l'utilisation combinée d'un ScriptBlock avec l'option ErrorAction ayant pour valeur STOP.
    Compte tenu des contraintes de l'environnement de production, je ne peux pas tester pour vérifier le comportement n'importe comment.
    Alors je me permets de vous poser la question ici ne trouvant pas la réponse à mes questions précisément ce sur point.

    'Instruction potentiellement problématique' est une commande qui permet d'exploiter une application tierce et qui lève une erreur inhérente à cette même application de manière aléatoire pour ne pas dire autrement que l'éditeur ne sait pas la corriger.
    Néanmoins, pour palier ce problème, il existe un moyen de contournement.

    Ma question est la suivante ; Lorsque Catch constate la levée d'une erreur :
    1] Est ce que 'd'autres instructions' va malgré tout être interprété avant le bloc Catch et ou peut-être après le bloc Catch ?
    2] Si oui, peut-on exécuter les instructions palliatives dans le bloc Catch ?
    3] Si non, quelle serait la bonne méthodologie si ce n'est pas trop demandé ?

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    try 
    {
        Invoke-Command -ComputerName $env:COMPUTERNAME -ErrorAction Stop -ScriptBlock {
     
            # Instruction potentiellement problématique' 
            # d'autres instructions'
        } 
    }
     
    catch 
    {
       $ErrorMessage = $_.Exception.Message
     
       Invoke-Command -ComputerName $env:COMPUTERNAME -ErrorAction Stop -ScriptBlock {
     
           # Instructions palliatives'
        }
    }

    En vous remerciant par avance. Cordialement.

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    https://devblogs.microsoft.com/scrip...rror-handling/
    https://docs.microsoft.com/en-us/pow...w=powershell-7

    1] Est ce que 'd'autres instructions' va malgré tout être interprété avant le bloc Catch et ou peut-être après le bloc Catch ?
    Dès que le bloc try constate une exception il stop et va dans le bloc catch correspondant à l'erreur si il existe. Sinon il remonte l’erreur à un niveau supérieur.
    Une fois le bloc try catch traité le programme continue

    2] Si oui, peut-on exécuter les instructions palliatives dans le bloc Catch ?
    3] Si non, quelle serait la bonne méthodologie si ce n'est pas trop demandé ?

    Le bloc finally est toujours exécuté

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par darkwall_37 Voir le message
    Ma question est la suivante ; Lorsque Catch constate la levée d'une erreur :
    C'est le rôle du bloque Try (protection), Catch répond à une 'protection' infructueuse. C'est plus précisément Try/Catch, car on ne peut avoir l'un sans l'autre.
    Catch ne gère (constate) que les exceptions que tu lui indiques ou toutes si tu n'en précises pas.

    Citation Envoyé par darkwall_37 Voir le message
    1] Est ce que 'd'autres instructions' va malgré tout être interprété avant le bloc Catch et ou peut-être après le bloc Catch ?
    Pour après, cela dépend de ta construction et si ton appel génère une exception ou une erreur Powershell.
    Tu peux gérer une exception pour une seule ligne ou sur tout le scriptblock.
    Citation Envoyé par darkwall_37 Voir le message
    2] Si oui, peut-on exécuter les instructions palliatives dans le bloc Catch ?
    Oui c'est son rôle, bien que dans ton cas le palliatif peut échouer car ton erreur est aléatoire.
    Il te faut donc savoir si c'est une résolution d'erreur (100% de réussite) ou une tentative de résolution.
    Citation Envoyé par darkwall_37 Voir le message
    3] Si non, quelle serait la bonne méthodologie si ce n'est pas trop demandé ?
    Tester les différents scénarios ou les simuler si la reproduction de la prod est possible ou pas trop longue à implémenter.
    Ici des boolean en entrées de tes tests peuvent suffire.

    Une possible réécriture, à moins que dans ton cas un second appel à Invoke-Command soit nécessaire :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    try
    {
      Invoke-Command -ComputerName $env:COMPUTERNAME -ErrorAction Stop -ScriptBlock {
        try {
          # Instructions potentiellement problématique
        }
        catch {
          # Instructions palliatives
          # PEUT ECHOUER ?
        }
        # d'autres instructions
     
        Finally {
         #libère les ressources
         # Exécute tjr une suite d'instructions même en cas d'erreur, ex : log
        }
        }
    }
     
    catch
    {
     #gère, entre autres, les exceptions inconnues dans le code de l'Invoke-Command et celles dues à WinRM
     $ErrorMessage = $_.Exception.Message
    }
    Reste à savoir si l'appelant de Invoke-Command doit connaitre l'erreur ou non.

Discussions similaires

  1. [PowerShell] Try Catch (ne Catch pas) une commande Exchange
    Par misterfx dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 02/06/2017, 18h56
  2. Question de syntaxe sur try catch
    Par snopims dans le forum ASP.NET
    Réponses: 2
    Dernier message: 18/09/2009, 05h13
  3. Réponses: 2
    Dernier message: 30/10/2007, 08h41
  4. [try-catch] relancer les instruction du bloc try
    Par nounou dans le forum Langage
    Réponses: 11
    Dernier message: 12/05/2004, 11h23
  5. Exception & Try..catch
    Par PurL dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/12/2002, 15h35

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