about_Try_Catch_Finally

Description courte

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

Description longue

Utilisez try, catchet 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, catchet finally ressemblent aux trymot clé catchfinally utilisées 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>}

La try mot clé est suivie 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>}

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 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." }

La 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.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 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 tryet 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 une sortie mot clé arrête le script à partir d’un catch bloc.

Voir aussi