about_Try_Catch_Finally
Description courte
Décrit comment utiliser les blocs catch
et finally
les try
blocs pour gérer les erreurs de fin.
Description longue
Utilisez try
, catch
et finally
bloquez pour répondre ou gérer les erreurs de fin dans les scripts. 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 empêche l’exécution d’une instruction. Si PowerShell ne gère pas d’erreur de fin d’une certaine façon, 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 de fin sont appelées exceptions.
Utilisez le try
bloc pour définir une section d’un script dans laquelle PowerShell doit surveiller les 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 de 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’erreurs.
Un catch
bloc peut inclure des commandes pour le suivi de l’erreur ou pour récupérer le flux attendu du script. Un catch
bloc peut spécifier les types d’erreurs 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 par votre script.
try
, catch
et finally
ressemblent aux try
catch
mots clés et finally
aux mots clés utilisés dans le langage de programmation C#.
Syntaxe
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.
Voici la syntaxe de try
bloc :
try {<statement list>}
Le try
mot clé est suivi d’une liste d’instructions dans les accolades. Si une erreur de fin se produit pendant l’exécution des instructions de la liste des instructions, le script transmet l’objet d’erreur du try
bloc à un bloc approprié catch
.
Voici la syntaxe de catch
bloc :
catch [[<error type>][',' <error type>]*] {<statement list>}
Les types d’erreurs apparaissent entre crochets. Les crochets les plus externes indiquent que l’élément est facultatif.
Le catch
mot clé est suivi 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’un d’eux est trouvé, les instructions du catch
bloc sont exécutées.
Le catch
bloc 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 catch
bloc gère les erreurs de la classe d’exception .NET Framework spécifiée ou d’une classe qui dérive de la classe spécifiée.
Si un bloc spécifie un catch
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’erreurs spécifiés.
Voici la syntaxe de finally
bloc :
finally {<statement list>}
Le finally
mot clé 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
a été exécutée sans erreur ou qu’une erreur a été interceptée dans une catch
instruction.
Notez que l’appui sur Ctrl+C arrête le pipeline. Les objets envoyés au pipeline ne sont pas affichés comme sortie. Par conséquent, si vous incluez une instruction à afficher, telle que « Enfin le bloc a été exécuté », il ne s’affiche pas après avoir appuyé sur Ctrl+C, même si le finally
bloc s’est 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 », il provoque une erreur de fin. 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 un nombre quelconque de catch
blocs. Par exemple, le script suivant a un try
bloc qui télécharge MyDoc.doc
et 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’erreurs par héritage. Un catch
bloc gère les erreurs de la classe d’exception .NET Framework spécifiée ou d’une classe qui dérive 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 de 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 pour la classe dérivée avant le catch
bloc de la classe générale.
Remarque
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 une tentative de capture
Lorsqu’une erreur de fin se produit dans un try
bloc avec une Trap
définition dans le try
bloc, même s’il existe un bloc correspondant catch
, l’instruction Trap
prend le contrôle.
Trap
S’il existe à un bloc supérieur à celui-ci try
et qu’il n’existe aucun bloc correspondant catch
dans l’étendue actuelle, il Trap
prend le contrôle, même si une étendue parente a un bloc correspondantcatch
.
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.
Il existe des propriétés supplémentaires accessibles, telles que ScriptStackTrace, Exception et ErrorDetails. Par exemple, si nous modifions le script en procédant comme suit :
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_.ScriptStackTrace
}
Le résultat est similaire à :
An Error occurred:
at <ScriptBlock>, <No file>: line 2
Libérer des ressources à l’aide de enfin
Pour libérer des ressources utilisées par un script, ajoutez un finally
bloc après le bloc et catch
les try
blocs. Les finally
instructions de bloc s’exécutent, que le try
bloc rencontre une erreur de fin. PowerShell exécute le finally
bloc avant que le script ne se termine ou avant que le bloc actuel 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.