Partager via


about_Try_Catch_Finally

Description courte

Décrit comment utiliser les tryblocs , catchet finally pour gérer les erreurs d’arrêt.

Description longue

Utilisez tryles blocs , catchet 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, catchet finally ressemblent aux trymots clés , catchet 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 tryqu’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.

Voir aussi