about_Try_Catch_Finally

Description courte

Décrit comment utiliser le try, catchet finally les blocs pour gérer les erreurs de fin.

Description longue

Utilisez try, et catchfinally 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 arrête é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 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 permettant de suivre l’erreur ou de 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, catchet ressemblent au try, catchet finallyfinally 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 en accolades. Si une erreur de fin se produit pendant que les instructions de la liste des instructions sont exécutées, 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’une d’elles est trouvée, 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 de n’importe quelle 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 s’est 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 en tant que sortie. Par conséquent, si vous incluez une instruction à afficher, telle que « Enfin bloc a exécuté », elle 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 » comme 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 n’importe quel nombre de catch blocs. Par exemple, le script suivant contient un try bloc qui télécharge MyDoc.docet 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 de n’importe quelle classe qui dérive de la classe spécifiée. L’exemple suivant contient un bloc qui intercepte une catch erreur « Command Not Found » :

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.

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 de la même façon qu’un bloc catch non qualifié.

Utilisation de pièges dans une tentative de capture

Lorsqu’une erreur de fin se produit dans un bloc avec une tryTrap définition dans le try bloc, même s’il existe un bloc correspondant catch , l’instruction Trap prend le contrôle.

Si un Trap bloc existe à un bloc supérieur à celui-ci tryet qu’il n’existe aucun bloc correspondant catch dans l’étendue actuelle, le Trap contrôle prend le 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.

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 sera 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 les blocs 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 bloc avant que finally le script ne se termine ou avant que le bloc actuel ne soit plus étendu.

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.

Voir aussi