about_Try_Catch_Finally

Mis à jour: mai 2014

S'applique à: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

RUBRIQUE

about_Try_Catch_Finally

DESCRIPTION COURTE

Décrit l'utilisation des blocs Try, Catch et Finally pour gérer les erreurs avec fin d'exécution.

DESCRIPTION DÉTAILLÉE

Les blocs Try, Catch et Finally permettent de gérer les erreurs avec fin d'exécution des scripts. L'instruction Trap peut également être utilisée pour gérer les erreurs avec fin d'exécution dans les scripts. Pour plus d'informations, consultez about_Trap.

Une erreur avec fin d'exécution arrête l'exécution d'une instruction. Si Windows PowerShell® ne gère pas une erreur avec fin d'exécution, Windows PowerShell arrêtera également la fonction ou le script à l'aide du pipeline actuel. Dans d'autres langages, tels que le langage C#, les erreurs avec fin d'exécution sont appelées exceptions. Pour plus d'informations sur les erreurs, consultez about_Errors.

Utilisez le bloc Try pour définir une section d'un script dans laquelle vous voulez que Windows PowerShell surveille les erreurs. Quand une erreur se produit dans le bloc Try, l'erreur est d'abord enregistrée dans la variable automatique $Error. Windows PowerShell recherche ensuite un bloc Catch pour gérer l'erreur. Si l'instruction Try n'a pas de bloc Catch correspondant, Windows PowerShell continue à rechercher un bloc Catch ou une instruction Trap dans les portées parents. À la fin d'un bloc Catch ou si aucun bloc Catch ni aucune instruction Trap appropriés n'ont été trouvés, le bloc Finally est exécuté. Si l'erreur ne peut pas être gérée,elle est écrite dans le flux d'erreurs.

Un bloc Catch peut inclure des commandes pour le suivi d'échec ou pour la récupération du flux de script attendu. Un bloc Catch peut spécifier le type d'erreurs à capturer. Une instruction Try peut inclure plusieurs blocs Catch pour différents types d'erreurs.

Un bloc Finally peut être utilisé pour libérer les ressources qui ne sont plus nécessaires à votre script.

Les blocs Try, Catch et Finally sont similaires aux mots clés Try, Catch et Finally utilisés dans le langage de programmation C#.

SYNTAXE

Une instruction Try contient un bloc Try, zéro, un ou plusieurs blocs Catch, et zéro, un ou plusieurs blocs Finally. Une instruction Try doit avoir au moins un bloc Catch ou un bloc Finally.

La syntaxe du bloc Try est la suivante :

          try {<statement list>}

Le mot clé Try est suivi d'une liste d'instructions entre accolades. Si une erreur avec fin d'exécution se produit pendant l'exécution des instructions de la liste, le script transmet l'objet d'erreur depuis le bloc Try vers le bloc Catch approprié.

La syntaxe du bloc Catch est la suivante :

          catch [[<error type>][',' <error type>]*] {<statement list>}

Les types d'erreurs apparaissent entre crochets. Les crochets extérieurs indiquent que l'élément est facultatif.

Le mot clé Catch est suivi d'une liste facultative de spécifications de type d'erreur, ainsi que d'une liste d'instructions. Si une erreur avec fin d'exécution se produit dans le bloc Try, Windows PowerShell recherche un bloc Catch approprié. S'il en trouve un, 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 de toute classe qui dérive de la classe spécifiée.

Si un bloc Catch spécifie un type d'erreur, cela signifie qu'il le gère. Si un bloc Catch ne spécifie pas de type d'erreur, il gérera toute les erreurs rencontrées dans le bloc Try. Une instruction Try peut inclure plusieurs blocs Catch pour les différents types d'erreurs spécifiés.

La syntaxe du bloc Finally est la suivante :

          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'exécution de l'instruction Try s'est déroulée sans erreur ou si une erreur a été détectée dans une instruction Catch.

Notez qu'en appuyant sur CTRL + C, vous arrêtez le pipeline. Les objets qui sont envoyés au pipeline ne s'afficheront pas en tant que sortie. Par conséquent, si vous incluez une instruction devant s'afficher, comme "Le bloc Finally a été exécuté", elle ne sera pas affichée si vous appuyez sur CTRL + C, même si le bloc Finally a été 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.

Windows PowerShell ne reconnaît pas "NonsenseString" comme une applet de commande ou un autre élément. L'exécution de ce script retourne le résultat suivant :

          An error occurred.

Quand le script rencontre "NonsenseString", il provoque une erreur avec fin d'exécution. 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 illimité de blocs Catch. Par exemple, le script suivant comprend un bloc Try qui télécharge MyFile.doc, ainsi que deux blocs Catch :

          try
          {
             $wc = new-object System.Net.WebClient
             $wc.DownloadFile("https://www.contoso.com/MyDoc.doc")
          }
          catch [System.Net.WebException],[System.IO.IOException]
          {
              "Unable to download MyDoc.doc from https://www.contoso.com."
          }
          catch
          {
              "An error occurred that could not be resolved."
          }

Le premier bloc Catch gère les erreurs de type System.Net.WebException et System.IO.IOException. Le second bloc Catch ne spécifie pas de type d'erreur. Le second bloc Catch gère les autres erreurs avec fin d'exécution qui se produisent.

Windows PowerShell effectue une correspondance des types d'erreurs par héritage. Un bloc Catch gère les erreurs de la classe d'exception .NET Framework spécifiée ou de toute classe qui dérive de la classe spécifiée. L'exemple suivant contient un bloc Catch qui intercepte une erreur du type "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 type "commande introuvable" :

          catch [System.SystemException] {"Base Exception" }

Ce bloc Catch gère l'erreur de commande introuvable, ainsi que les 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 de la classe dérivée avant le bloc Catch de la classe générale.

LIBÉRATION DES RESSOURCES À L'AIDE DU BLOC FINALLY

Pour libérer les ressources utilisées par un script, ajoutez un bloc Finally après les blocs Try et Catch. Les instructions du bloc Finally sont exécutées, que le bloc Try rencontre ou non une erreur avec fin d'exécution. Windows PowerShell exécute le bloc Finally avant la fin du script ou avant que le bloc actuel ne devienne hors de portée.

Un bloc Finally s'exécutera même si vous utilisez CTRL + C pour arrêter le script. Un bloc Finally s'exécutera également si un mot clé Exit arrête le script depuis un bloc Catch.

VOIR AUSSI

about_Break

about_Continue

about_Scopes

about_Throw

about_Trap