Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Brève description
Décrit comment utiliser les blocs try, catchet finally pour gérer les erreurs de fin.
Description longue
Utilisez try, catchet les blocs finally 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 bloc try pour définir une section d’un script dans laquelle PowerShell doit surveiller les erreurs. Lorsqu’une erreur se produit dans le bloc try, l’erreur est d’abord enregistrée dans la variable automatique $Error. PowerShell recherche ensuite un bloc catch pour gérer l’erreur. Si l’instruction try n’a pas de bloc de catch correspondant, PowerShell continue de rechercher un bloc catch approprié ou une instruction trap dans les étendues parentes. Une fois qu’un bloc catch est terminé ou si aucune instruction catch appropriée ou trap est trouvée, le bloc finally est exécuté. Si l’erreur ne peut pas être gérée, l’erreur est écrite dans le flux d’erreurs.
Un bloc catch peut inclure des commandes permettant de suivre l’erreur ou de récupérer le 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 différents types d’erreurs.
Un bloc finally peut être utilisé pour libérer toutes les ressources qui ne sont plus nécessaires par votre script.
try, catchet finally ressemblent aux mots clés try, catchet 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 avoir au moins un bloc catch ou un bloc finally.
Voici la syntaxe de bloc try :
try {<statement list>}
Le mot clé try 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 bloc try à un bloc catch approprié.
Voici la syntaxe de bloc catch :
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 mot clé catch 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 bloc try, PowerShell recherche un bloc catch approprié. Si l’un d’eux est trouvé, les instructions du 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 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 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.
Voici la syntaxe de bloc finally :
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 qu’une erreur a été interceptée dans une instruction catch.
Notez que le fait d’appuyer 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 « Le bloc Final a été exécuté », elle ne s’affiche pas après avoir appuyé sur Ctrl+C, même si le bloc finally s’est exécuté.
Interception des erreurs
L’exemple de script suivant montre un bloc try avec un bloc catch :
try { NonsenseString }
catch { "An error occurred." }
Le mot clé catch doit suivre immédiatement le bloc try ou un autre bloc catch.
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 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 avoir un nombre quelconque de blocs catch. Par exemple, le script suivant a un bloc try qui télécharge MyDoc.docet contient deux blocs catch :
try {
$wc = New-Object System.Net.WebClient
$wc.DownloadFile("https://httpbin.org/MyDoc.doc","C:\temp\MyDoc.doc")
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} catch {
"An error occurred that could not be resolved."
}
Le premier bloc catch gère les erreurs des types de System.Net.WebException et System.IO.IOException. Le deuxième bloc catch ne spécifie pas de type d’erreur. Le deuxième bloc catch gère toutes les autres erreurs de fin qui se produisent.
PowerShell correspond aux types d’erreurs par héritage. Un bloc catch 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 bloc catch 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 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 l’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.
Note
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 bloc try avec un trap défini dans le bloc try, même s’il existe un bloc catch correspondant, l’instruction trap prend le contrôle.
Si un trap existe à un bloc supérieur à la tryet qu’il n’existe aucun bloc catch correspondant dans l’étendue actuelle, le trap prend le contrôle, même si une étendue parente a un bloc catch correspondant.
Accès aux informations d’exception
Dans un catch bloc, l’erreur actuelle est accessible à l’aide de la variable ou de la $_$PSItem variable automatique. 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.
Des propriétés supplémentaires sont accessibles, telles que ScriptStackTrace, Exceptionet 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 bloc de finally après les blocs try et catch. Les instructions de bloc finally s’exécutent, que le bloc try rencontre une erreur de fin. PowerShell exécute le bloc finally avant que le script ne se termine ou avant que le bloc actuel sorte de l’étendue.
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.
Dans l’exemple suivant, le bloc try tente de télécharger un fichier dans le dossier C:\temp. Les blocs catch gèrent les erreurs qui se produisent pendant le téléchargement. Le bloc finally supprime l’objet WebClient et supprime le fichier temporaire s’il existe.
try {
$wc = New-Object System.Net.WebClient
$tempFile = "C:\temp\MyDoc.doc"
$wc.DownloadFile("https://httpbin.org/MyDoc.doc",$tempFile)
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} catch {
"An error occurred that could not be resolved."
} finally {
$wc.Dispose()
if (Test-Path $tempPath) { Remove-Item $tempFile }
}