l’une des parties clés de tout bon script PowerShell est la gestion des erreurs. Même dans le script le plus court, être capable de gérer les erreurs permet de s’assurer qu’un événement inattendu ne détruira pas le système sur lequel vous travaillez. Prenons l’exemple ci-dessous. Chaque semaine dans notre société témoin (MyCompany.Com) les ressources humaines vont télécharger une liste nous indiquant qui devrait avoir accès à la base de données des dépenses., Si un nom ne figure pas dans la liste des ressources humaines, nous allons le supprimer du groupe et cet utilisateur ne pourra plus enregistrer les demandes de remboursement de dépenses:
Maintenant, vous pouvez voir où cela va mal tourner. Une semaine HR ne parvient pas à télécharger la liste ou, tout comme nous sommes sur le point d’accéder à la liste, le serveur de fichiers meurt. Soudain, PowerShell génère une erreur sur L’applet de commande Get-Content et la variable Author AuthorizedUser reste vide. Parce que notre script ne gère pas les erreurs, il continue de s’exécuter et, en très peu de temps, il a supprimé tous les utilisateurs de notre groupe de dépenses., Très vite, les appels téléphoniques furieux commencent à inonder et la vie devient un peu moins heureuse. La façon d’éviter tout cela est d’attraper les erreurs, puis de gérer l’événement qui les a provoquées (ce qui dans ce cas est d’arrêter le script et de crier à quelqu’un en RH).
erreurs de terminaison et de Non-terminaison
l’une des principales choses à savoir lors de la détection d’erreurs est que seules certaines erreurs peuvent être interceptées par défaut. Les erreurs sont de deux types: terminaison et non terminaison. Une erreur de fin est une erreur qui arrêtera une fonction ou une opération., Si vous faites une erreur de syntaxe ou de la mémoire, qui est une terminaison d’erreur. Les erreurs de terminaison peuvent être interceptées et traitées. Les erreurs Non terminantes permettent à Powershell de continuer et proviennent généralement d’applets de commande ou d’autres situations gérées. Dans des circonstances normales, ils ne peuvent pas être capturés par Try-Catch-Finally. L’erreur Get-Content dans l’exemple ci-dessus est une erreur de non-terminaison.
traiter les erreurs Non terminantes comme terminantes
alors, comment intercepter une erreur Non terminatrice? Fondamentalement, vous dites à PowerShell de le traiter comme se terminant. Pour ce faire, vous utilisez le paramètre ErrorAction., Chaque applet de commande PowerShell prend en charge ErrorAction. En spécifiant-ErrorAction Stop à la fin d’une applet de commande, vous vous assurez que toutes les erreurs qu’elle génère sont traitées comme se terminant et peuvent être interceptées. Dans notre exemple ci-dessus, nous allons changer notre ligne Get-Content en:
$AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop
traitant toutes les erreurs comme se terminant
Il est également possible de traiter toutes les erreurs comme se terminant en utilisant la variable ErrorActionPreference. Vous pouvez le faire soit pour le script avec lequel vous travaillez, soit pour toute la session PowerShell. Pour le définir dans un script, faites la première ligne $ErrorActionPreference = Stop., Pour le définir pour la session, tapez er ErrorActionPreference = Stop sur la console PowerShell.
attraper une erreur de terminaison
Une fois que vous vous êtes assuré que l’erreur que vous essayez d’attraper sera traitée comme se terminant, vous pouvez créer un bloc Try Catch autour de la commande (ou des commandes) qui pourraient provoquer l’erreur. La première étape consiste à entourer la section de votre script peut jeter l’erreur avec un bloc Try. Dans notre exemple, le Contenu de la ligne devient:
Try{ $AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop}
Immédiatement après le bloc Try, vous devez placer un bloc Catch pour traiter l’erreur., Le bloc Catch n’est accessible que si une erreur de fin se produit, sinon il est ignoré. Dans notre exemple, nous allons envoyer un e-mail à un administrateur pour lui dire qu’il y a eu une erreur, puis arrêter le script. Notre Contenu en ligne est maintenant:
Accès à L’Enregistrement d’Erreur
une Fois que vous êtes à l’intérieur d’un bloc catch, vous pouvez accéder à l’enregistrement d’erreur, qui est stocké dans l’objet courant variable $_. Les enregistrements d’erreur ont diverses propriétés utiles, mais la principale à laquelle vous souhaitez accéder est $_.Exception., Les Exceptions sont ce que nous traitons vraiment ici lorsque nous attrapons et traitons les erreurs – les exceptions sont l’événement inattendu qui a causé l’erreur (l’enregistrement d’erreur lui-même n’est en fait qu’un wrapper pour présenter l’exception à L’utilisateur PowerShell). C’est l’exception qui nous rattrape et l’exception qui contient toutes les informations vraiment utiles sur le problème. S’il y avait un autre problème sous-jacent qui a causé notre exception, il est également enregistré à $_.exception.innerexception (et ainsi de suite – la prochaine exception sous-jacente est stockée à $_.exception.innerexception.,innerexception etc.). Pour les fins de notre exemple, nous allons utiliser $_.Exception pour mettre des informations supplémentaires dans notre e-mail de notification, en utilisant le__.Exception.Message et $_.Exception.ItemName properties:
Catching Specific Exceptions
maintenant, comme notre exemple se présente, nous attrapons toutes les erreurs qui se produisent pendant la lecture du fichier et les traitons tous de la même manière. Vous pouvez cependant attraper des exceptions spécifiques et les traiter différemment, mais – et c’est un gros mais – seulement si l’erreur d’origine se termine., Étant donné que L’applet de commande Get-Content génère des erreurs non terminantes (que nous avons uniquement traitées comme se terminant à L’aide D’ErrorAction), nous ne pouvons pas détecter spécifiquement les différentes exceptions que l’applet de commande peut lancer. Il s’agit d’une fonctionnalité de PowerShell et s’applique à toute erreur non terminante, indépendamment de ErrorActionPreference et ne peut pas être modifiée. Néanmoins, nous pouvons traiter d’autres exceptions terminantes, telles qu’une erreur de mémoire insuffisante, qui pourraient apparaître pendant l’opération de lecture. Aux fins de cet exemple, c’est ce que nous allons faire.,
vous détectez des erreurs de terminaison spécifiques en spécifiant le nom de l’exception immédiatement après le mot clé Catch. Dans notre exemple, nous voulons attraper un Système.Exception OutOfMemory et, si nous en obtenons un, adoptera l’approche non-sens du redémarrage immédiat de l’ordinateur. Nous inclurons également un bloc catch général après notre bloc file not found pour attraper toutes les autres exceptions:
enfin, en utilisant enfin
La dernière partie de Try Catch enfin est le bloc Finally. Cela doit être défini immédiatement après le bloc Catch et s’exécute à chaque fois, qu’il y ait eu une erreur ou non., De cette façon, vous pouvez effectuer des actions qui doivent être effectuées, qu’une opération réussisse ou échoue. Dans notre exemple, nous allons enregistrer qu’une lecture de fichier a été tentée. Notre Contenu en ligne ressemble maintenant à: