about_Try_Catch_Finally
Description courte
Décrit comment utiliser les try
blocs , catch
et finally
pour gérer les erreurs d’arrêt.
Description longue
Utilisez try
les blocs , catch
et finally
pour répondre aux erreurs d’arrêt dans les scripts ou les gérer. L’instruction Trap
peut également être utilisée pour gérer les erreurs de fin dans les scripts. Pour plus d’informations, consultez about_Trap.
Une erreur de fin arrête l’exécution d’une instruction. Si PowerShell ne gère pas d’erreur d’arrêt d’une manière ou d’une autre, PowerShell cesse également d’exécuter la fonction ou le script à l’aide du pipeline actuel. Dans d’autres langages, comme C#, les erreurs de fin sont appelées exceptions.
Utilisez le try
bloc pour définir une section d’un script dans laquelle vous souhaitez que PowerShell surveille la recherche d’erreurs. Lorsqu’une erreur se produit dans le try
bloc, l’erreur est d’abord enregistrée dans la $Error
variable automatique. PowerShell recherche ensuite un catch
bloc pour gérer l’erreur. Si l’instruction try
n’a pas de bloc correspondantcatch
, PowerShell continue à rechercher un bloc ou Trap
une instruction approprié catch
dans les étendues parentes. Une fois qu’un catch
bloc est terminé ou si aucun bloc ou Trap
instruction approprié catch
n’est trouvé, le finally
bloc est exécuté. Si l’erreur ne peut pas être gérée, l’erreur est écrite dans le flux d’erreur.
Un catch
bloc peut inclure des commandes permettant de suivre l’erreur ou de récupérer le flux attendu du script. Un catch
bloc peut spécifier les types d’erreur qu’il intercepte. Une try
instruction peut inclure plusieurs catch
blocs pour différents types d’erreurs.
Un finally
bloc peut être utilisé pour libérer toutes les ressources qui ne sont plus nécessaires à votre script.
try
, catch
et finally
ressemblent aux try
mots clés , catch
et finally
utilisés dans le langage de programmation C#.
Syntax
Une try
instruction contient un try
bloc, zéro ou plusieurs catch
blocs et zéro ou un finally
bloc. Une try
instruction doit avoir au moins un catch
bloc ou un finally
bloc.
La syntaxe de bloc est la try
suivante :
try {<statement list>}
La try
mot clé est suivie d’une liste d’instructions en accolades. Si une erreur de fin se produit pendant l’exécution des instructions de la liste d’instructions, le script transmet l’objet d’erreur du try
bloc à un bloc approprié catch
.
La syntaxe de bloc est la catch
suivante :
catch [[<error type>][',' <error type>]*] {<statement list>}
Les types d’erreur s’affichent entre crochets. Les crochets les plus externes indiquent que l’élément est facultatif.
La catch
mot clé est suivie d’une liste facultative de spécifications de type d’erreur et d’une liste d’instructions. Si une erreur de fin se produit dans le try
bloc, PowerShell recherche un bloc approprié catch
. Si l’une d’elles est trouvée, les instructions dans le catch
bloc sont exécutées.
Le catch
bloc peut spécifier un ou plusieurs types d’erreur. Un type d’erreur est une exception Microsoft .NET Framework ou une exception dérivée d’une exception .NET Framework. Un catch
bloc gère les 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 catch
bloc spécifie un type d’erreur, ce catch
bloc gère ce type d’erreur. Si un catch
bloc ne spécifie pas de type d’erreur, ce catch
bloc gère toute erreur rencontrée dans le try
bloc. Une try
instruction peut inclure plusieurs catch
blocs pour les différents types d’erreur spécifiés.
La syntaxe de bloc est la finally
suivante :
finally {<statement list>}
La finally
mot clé est suivie 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 catch
instruction.
Notez que le fait d’appuyer sur Ctrl+C arrête le pipeline. Les objets envoyés au pipeline ne sont pas affichés en tant que sortie. Par conséquent, si vous incluez une instruction à afficher, telle que « Enfin le bloc a été exécuté », elle ne s’affiche pas lorsque vous appuyez sur Ctrl+C, même si le finally
bloc a été exécuté.
Interception des erreurs
L’exemple de script suivant montre un try
bloc avec un catch
bloc :
try { NonsenseString }
catch { "An error occurred." }
Le catch
mot clé doit suivre immédiatement le try
bloc ou un autre catch
bloc.
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 :
An error occurred.
Lorsque le script rencontre « NonsenseString », une erreur de fin est générée. Le catch
bloc gère l’erreur en exécutant la liste d’instructions à l’intérieur du bloc.
Utilisation de plusieurs instructions catch
Une try
instruction peut avoir n’importe quel nombre de catch
blocs. Par exemple, le script suivant a un try
bloc qui télécharge MyDoc.doc
, et il contient deux catch
blocs :
try {
$wc = new-object System.Net.WebClient
$wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from http://www.contoso.com."
}
catch {
"An error occurred that could not be resolved."
}
Le premier catch
bloc gère les erreurs des types System.Net.WebException et System.IO.IOException . Le deuxième catch
bloc ne spécifie pas de type d’erreur. Le deuxième catch
bloc gère toutes les autres erreurs de fin qui se produisent.
PowerShell correspond aux types d’erreur par héritage. Un catch
bloc gère les 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 catch
bloc qui intercepte une erreur « Commande introuvable » :
catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }
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] {"Base Exception" }
Ce catch
bloc 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 l’une de ses classes dérivées, placez le catch
bloc de la classe dérivée avant le catch
bloc de la classe générale.
Notes
PowerShell encapsule toutes les exceptions dans un type RuntimeException . Par conséquent, la spécification du type d’erreur System.Management.Automation.RuntimeException se comporte comme un bloc catch non qualifié.
Utilisation de pièges dans un try catch
Lorsqu’une erreur de fin se produit dans un try
bloc avec un Trap
défini dans le try
bloc, même s’il existe un bloc correspondant catch
, l’instruction prend le Trap
contrôle.
Si un Trap
existe à un bloc supérieur à et try
qu’il n’existe aucun bloc correspondant catch
dans l’étendue actuelle, le prend le Trap
contrôle, même si une étendue parente a un bloc correspondant catch
.
Accès aux informations d’exception
Dans un catch
bloc, l’erreur actuelle est accessible à l’aide $_
de , également appelée $PSItem
. L’objet est de type ErrorRecord.
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_
}
L’exécution de ce script retourne le résultat suivant :
An Error occurred:
The term 'NonsenseString' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.
D’autres propriétés sont accessibles, telles que ScriptStackTrace, Exception et ErrorDetails. Par exemple, si nous modifions le script comme suit :
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_.ScriptStackTrace
}
Le résultat sera similaire à ce qui suit :
An Error occurred:
at <ScriptBlock>, <No file>: line 2
Libérer des ressources à l’aide de finally
Pour libérer les ressources utilisées par un script, ajoutez un finally
bloc après les try
blocs et catch
. Les finally
instructions de bloc s’exécutent que le try
bloc rencontre ou non une erreur de fin. PowerShell exécute le finally
bloc avant l’arrêt du script ou avant que le bloc actuel ne sorte de l’étendue.
Un finally
bloc s’exécute même si vous utilisez ctrl+C pour arrêter le script. Un finally
bloc s’exécute également si un mot clé exit arrête le script à partir d’un catch
bloc.