Blog ENI : Toute la veille numérique !
🎁 Jusqu'au 31/12, recevez notre
offre d'abonnement à la Bibliothèque Numérique. Cliquez ici
🎁 Jusqu'au 31/12, recevez notre
offre d'abonnement à la Bibliothèque Numérique. Cliquez ici

La gestion des erreurs

Comment gérer les erreurs en PowerShell ?

La gestion des erreurs fait partie intégrante du travail dès lors qu’il s’agit d’écrire des scripts ou des modules PowerShell. Le comportement attendu est couramment contrôlé par la vérification et la validation de conditions. En cas de problème, nous parlons alors de la gestion des exceptions. Nous devons donc effectuer cette gestion à tous les niveaux, que ce soit dans les fonctions ou dans les scripts.

Comment effectuer cette gestion facilement en PowerShell ?

Try/Catch et/ou Finally

1. Try/Catch

a. Explications

Avec PowerShell, il est possible de tester facilement la bonne exécution d’une commande en utilisant deux termes :

  • Try : essaie d’exécuter une action.

  • Catch : capture le retour et exécute une action uniquement en cas d’erreur.

La commande sera à exécuter dans le bloc du Try, tandis que la capture de l’erreur, si erreur il y a, se fera dans le bloc Catch.

La syntaxe est la suivante :

Try 
{ 
  <Code à tester ou fonctions> 
} 
Catch 
{ 
  <Message si une erreur est détectée> 
}  

b. Structure

Analysons donc cette structure.

Nous avons, dans un premier temps, le bloc Try qui nous permettra de signifier à PowerShell de tester le code.

Dans un second temps, si une erreur est détectée, le contenu du bloc Catch sera exécuté pour capturer la nature de l’erreur et éventuellement renvoyer un message d’erreur.

Try 
{ 
  <Code à tester ou fonctions> 
} 
Catch 
{ 
  <Message si une erreur a été détectée> 
} 

c. Explication en exemple

Prenons l’exemple suivant : nous souhaitons redémarrer un service spécifique. Le service sera IntuneManagementExtension. Dans le bloc Try, nous allons tout d’abord récupérer les informations sur le service concerné puis le redémarrer. Le bloc Catch permettra de nous reporter l’erreur, si erreur il y a.

Le code permettant de vérifier l’état du service sera le suivant :

$Service = Get-Service IntuneManagementExtension 

Le code...

ErrorAction et ErrorActionPreference

1. Erreur bloquante ou non bloquante

En PowerShell, lors de l’exécution d’un script ou d’une commande, il existe deux types d’erreurs :

  • erreur bloquante, également nommée « terminating error »,

  • erreur non bloquante, également nommée « non-terminating error ».

Le nommage terminating et non-terminating est éloquent. Nous comprenons ainsi simplement qu’une erreur bloquante (terminating) arrêtera l’exécution de la suite du code tandis qu’une erreur non bloquante (non-terminating) n’empêchera pas la suite de l’exécution.

Dans la syntaxe Try/Catch, le bloc Catch n’attrapera que les erreurs dites bloquantes.

Reprenons l’exemple du code précédent dans lequel nous avons faussé le nom du service.

Try 
{ 
    $Service = get-service IntuneManagementExtensionn 
    Restart-Service  IntuneManagementExtensionn 
    write-host "Redémarrage du service en succès" 
} 
Catch 
{ 
    write-warning "Une erreur est survenue" 
} 

Ci-dessous le résultat :

images/25RI06.png

Celui-ci nous indique qu’il y a une erreur au niveau du Get-Service, ce qui signifie donc qu’il n’a pas trouvé le service concerné, puis au niveau de la cmdlet Restart-Service.

Cependant, l’exécution du reste du code continue, puisque nous avons le texte Redémarrage du service en succès qui s’affiche, ce qui implique également que le bloc Catch n’a pas attrapé l’erreur.

2. Changer le comportement d’exécution

Le Try/Catch ne permettant pas d’attraper toutes les erreurs (uniquement les bloquantes), il est possible de modifier le comportement du code afin de spécifier d’arrêter l’exécution en cas d’erreur.

Deux éléments nous permettront de modifier le comportement d’un script ou d’une commande :

  • -ErrorAction : paramètre de cmdlet.

  • $ErrorActionPreference : variable d’environnement.

Le paramètre -ErrorAction agit sur une cmdlet tandis que la variable d’environnement $ErrorActionPreference agit...

Récupérer le message d’erreur

Dans la section Try/Catch et/ou Finally, nous avons vu qu’il était possible de récupérer les erreurs avec le Try/Catch.

Cependant, dans notre exemple, l’erreur n’était pas détaillée, car nous avons affiché un message personnalisé Une erreur est survenue.

Dans le chapitre Les variables, nous avons vu qu’il existait différents types de variables, dont les variables automatiques. Parmi celles-ci, nous avons la variable $Error qui permet de retourner toutes les erreurs rencontrées. L’affichage de $Error stockera et listera dans un tableau toutes les erreurs rencontrées dans la session PowerShell.

Ci-dessous le retour affiché par la variable $Error lors de l’exécution du script précédent lorsque ce dernier est exécuté sans droits administrateurs :

images/RI25_service8.png

Cela peut être compliqué si plusieurs erreurs sont rencontrées. Il pourra alors être judicieux de récupérer la dernière erreur.

Pour cela, nous récupérerons la dernière entrée en ajoutant [0] après la variable.

$Error[0] 

Pour récupérer le message, analysons l’objet PowerShell $Error.

PS C:\Users\damien.vanrobaeys> $error | get-member 
 
Name 
---- 
Equals 
GetHashCode 
GetObjectData 
GetType ...