RUBRIQUE
about_Try_Catch_Finally
DESCRIPTION COURTE
Décrit comment utiliser les blocs Try, Catch et Finally pour gérer des
erreurs avec fin d'exécution.
DESCRIPTION LONGUE
Utilisez les blocs Try, Catch et Finally pour répondre à des
erreurs avec fin d'exécution ou pour les gérer dans les scripts.
L'instruction Trap peut également être utilisée pour gérer des
erreurs avec fin d'exécution dans les scripts. Pour plus
d'informations, consultez about_Trap.
Une erreur avec fin d'exécution empêche une instruction de
fonctionner. Si Windows PowerShell ne parvient pas à gérer une
erreur avec fin d'exécution d'une manière ou d'une autre, Windows
PowerShell cesse également d'exécuter la fonction ou le script à
l'aide du pipeline actuel. Dans d'autres langages, tels que C#,
les erreurs avec fin d'exécution sont connues sous le nom
d'exceptions. Pour plus d'informations sur les erreurs, consultez
about_Errors.
Utilisez le bloc Try pour définir une section d'un script dans
lequel vous souhaitez que Windows PowerShell surveille les erreurs.
Lorsqu'une erreur se produit dans le bloc Try, l'erreur est d'abord
enregistrée dans la variable automatique $Error. Windows PowerShell
recherche ensuite un bloc Catch pour gérer l'erreur. Si l'instruction
Try n'a pas de bloc Catch correspondant, Windows PowerShell continue
à rechercher un bloc Catch ou une instruction Trap approprié dans les
portées parentes. Après qu'un bloc Catch a été exécuté ou si aucun
bloc Catch ni aucune instruction Trap approprié n'est identifié, le
bloc Finally est exécuté. Si l'erreur ne peut pas être gérée, elle
est écrite dans le flux d'erreurs.
Un bloc Catch peut inclure des commandes pour le suivi de l'échec
ou pour la récupération du flux attendu du script. Un bloc Catch peut
spécifier les types d'erreurs qu'il intercepte. Une instruction Try
peut inclure plusieurs blocs Catch pour les différents types d'erreurs.
Un bloc Finally peut être utilisé pour libérer des ressources qui
ne sont plus exigées par votre script.
Try, Catch et Finally ressemblent aux mots clés Try, Catch et Finally
utilisés dans le langage de programmation C#.
Syntaxe
Une instruction Try contient un bloc Try, zéro ou plusieurs
blocs Catch et zéro ou un bloc Finally. Une instruction Try
doit comporter au moins un bloc Catch ou un bloc Finally.
La syntaxe du bloc Try est la suivante :
try {<statement list>}
Le mot clé Try est suivi d'une liste d'instructions entre
accolades. Si une erreur avec fin d'exécution se produit pendant
l'exécution des instructions de la liste d'instructions, le script
passe l'objet erreur du bloc Try à un bloc Catch approprié.
La syntaxe du bloc Catch est la suivante :
catch [[<error type>][',' <error type>]*] {<statement list>}
Les types d'erreurs apparaissent entre crochets. Les crochets
les plus à l'extérieur indiquent que l'élément est facultatif.
Le mot clé Catch est suivi d'une liste facultative de
spécifications de types d'erreurs et d'une liste d'instructions.
Si une erreur avec fin d'exécution se produit dans le bloc
Try, Windows PowerShell recherche un bloc Catch approprié. Si
un bloc est trouvé, les instructions dans le bloc Catch sont
exécutées.
Le bloc Catch peut spécifier un ou plusieurs types d'erreurs.
Un type d'erreur est une exception Microsoft .NET Framework ou une
exception dérivée d'une exception .NET Framework. Un bloc Catch gère
des erreurs de la classe d'exception .NET Framework spécifiée ou de
toute classe dérivée de la classe spécifiée.
Si un bloc Catch spécifie un type d'erreur, ce bloc Catch gère
ce type d'erreur. Si un bloc Catch ne spécifie pas de type
d'erreur, ce bloc Catch gère toute erreur rencontrée dans le
bloc Try. Une instruction Try peut inclure plusieurs blocs
Catch pour les différents types d'erreurs spécifiés.
La syntaxe du bloc Finally est la suivante :
finally {<statement list>}
Le mot clé Finally est suivi d'une liste d'instructions qui
s'exécute chaque fois que le script est exécuté, même si
l'instruction Try s'est exécutée sans erreur ou si une erreur
a été interceptée dans une instruction Catch.
Notez qu'en appuyant sur CTRL+C, vous arrêtez le pipeline. Les
objets envoyés au pipeline ne seront pas affichés en tant que
sortie. Par conséquent, si vous incluez une instruction à
afficher, telle que " Le bloc Finally a été exécuté ", elle ne
s'affiche pas après que vous avez appuyé sur CTRL+C, même si le bloc
Finally a été exécuté.
Interception d'erreurs
L'exemple de script suivant montre un bloc Try avec un bloc Catch :
try { NonsenseString }
catch { "Une erreur s'est produite." }
Le mot clé Catch doit suivre immédiatement le bloc Try ou un
autre bloc Catch.
Windows PowerShell ne reconnaît pas " NonsenseString " en tant
qu'applet de commande ou autre élément. L'exécution de ce
script retourne le résultat suivant :
Une erreur s'est produite.
Lorsque le script rencontre " NonsenseString ", il provoque une
erreur avec fin d'exécution. Le bloc Catch gère l'erreur en
exécutant la liste d'instructions à l'intérieur du bloc.
Utilisation de plusieurs instructions Catch
Une instruction Try peut comporter un nombre quelconque de
blocs Catch. Par exemple, le script suivant comporte un bloc Try qui
télécharge MyFile.doc et il contient deux blocs Catch :
try
{
$wc = new-object System.Net.WebClient
$wc.DownloadFile("https://www.contoso.com/MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException]
{
"Impossible de télécharger MyDoc.doc à partir de https://www.contoso.com."
}
catch
{
"Une erreur s'est produite et n'a pas pu être résolue."
}
Le premier bloc Catch gère des erreurs de type System.Net.WebExc
eption et System.IO.IOException. Le second bloc Catch ne spécifie
pas de type d'erreur. Le second bloc Catch gère toutes les autres
erreurs avec fin d'exécution qui se produisent.
Windows PowerShell fait correspondre les types d'erreurs par
héritage. Un bloc Catch gère des erreurs de la classe d'exception
.NET Framework spécifiée ou de toute classe dérivée de la classe
spécifiée. L'exemple suivant contient un bloc Catch qui intercepte
une erreur " Commande introuvable " :
catch [System.Management.Automation.CommandNotFoundException]
{"Exception héritée" }
Le type d'erreur spécifié, CommandNotFoundException,
hérite du type System.SystemException. L'exemple suivant
intercepte également une erreur " Commande introuvable " :
catch [System.SystemException] {"Exception de base" }
Ce bloc Catch gère l'erreur " Commande introuvable " et
d'autres erreurs qui héritent du type SystemException.
Si vous spécifiez une classe d'erreur et une de ses classes
dérivées, placez le bloc Catch pour la classe dérivée avant
le bloc Catch pour la classe générale.
Libération de ressources à l'aide de Finally
Pour libérer des ressources utilisées par un script, ajoutez un
bloc Finally après les blocs Try et Catch. Les instructions du
bloc Finally sont exécutées, que le bloc Try rencontre une erreur
avec fin d'exécution ou non. Windows PowerShell exécute le bloc
Finally avant la fin du script ou avant que le bloc actuel
soit hors de portée.
Un bloc Finally s'exécute même si vous utilisez CTRL+C pour
arrêter le script. Un bloc Finally s'exécute également si un
mot clé Exit arrête le script à partir d'un bloc Catch.
VOIR AUSSI
about_Errors
about_Trap