Attraper une exception en Powershell

Avec Powershell il est possible d’attraper des exceptions. Une Exception est un signal qu’une commande envoie lorsque une erreur se produit.

Ce qui est intéressant avec cette approche est que nous pouvons regrouper une série de commandes dans un script block, et attraper toutes les erreurs d’une seule et même façon.

Sans ça nous devrions vérifier chaque commande et agir en conséquence ce qui augmenterait considérablement la quantité de code à écrire.

On utilise les exceptions avec le trio: Try, Catch, Finally

  1. Try (Essayer), permet d’essayer toutes les commandes dans un script block.
  2. Catch, récupère toutes les erreurs produites par les commandes dans le script block
  3. Finally, permet d’exécuter un script block après que le catch ait fini de traiter les exceptions reçues. (non traité dans cet article)

Voici un exemple:

Dans cet exemple nous listons les fichiers dans le répertoire actuel, nous testons si « localhost » répond au ping, et nous créons le répertoire « c:\temp ».

Toutes ces commandes peuvent avoir des erreurs indépendantes, et pour les attraper, nous allons continuer le code avec la partie catch.

Maintenant nous pour toute exception attrapée nous pouvons afficher le message.

Imaginons maintenant que nous voudrions être plus fins.

Par exemple, la commande New-Item peut produire une exception si le répertoire C:\TEMP existe déjà. Et nous voudrions customiser le message que dans ce cas là.

Tout d’abord il faut trouver la bonne exception, et ce n’est pas simple, mais voici un truc.

On indique tout d’abord à Powershell de s’arrêter si une erreur se produit (normalement il continue) avec la commande suivante:

Ensuite on reproduit l’erreur, dans notre cas on crée le répertoire deux fois pour que la deuxième fois une exception se produise.

Une fois l’exception reçue, on peut regarder son nom exact avec ceci:

Notre exception particulière qui apparaît lorsque on essaye de créer un dossier qui existe déjà est : System.IO.IOException.

Du coup on peut faire un catch dédié à ce type d’exceptions avec ceci:

Notre exception IO sera attrapée par son catch individuel et pourra être traitée à sa façon.