RUBRIQUE about_Trap DESCRIPTION COURTE Décrit un mot clé qui gère une erreur avec fin d'exécution. DESCRIPTION LONGUE Une erreur avec fin d'exécution empêche une instruction de fonctionner. Si Windows PowerShell ne parvient pas à gérer une erreur avec fin d'exécution d'une manière ou d'une autre, Windows PowerShell cesse également d'exécuter la fonction ou le script dans le pipeline actuel. Dans d'autres langages, tels que C#, les erreurs avec fin d'exécution sont connues sous le nom d'exceptions. Le mot clé Trap spécifie une liste d'instructions à exécuter lorsqu'une erreur avec fin d'exécution se produit. Les instructions Trap gèrent les erreurs avec fin d'exécution et autorise l'exécution du script ou de la fonction afin qu'elle se poursuive au lieu de s'arrêter. Syntaxe La syntaxe de l'instruction Trap est la suivante : trap [[<error type>]] {<statement list>} L'instruction Trap inclut une liste d'instructions à exécuter lorsqu'une erreur avec fin d'exécution se produit. Le mot clé Trap peut spécifier un type d'erreur de manière facultative. Un type d'erreur requiert des crochets. Un script ou une commande peuvent avoir plusieurs instructions Trap. Les instructions Trap peuvent apparaître n'importe où dans le script ou la commande. Interruption de toutes les erreurs avec fin d'exécution Lorsqu'une erreur avec fin d'exécution, non gérée d'une autre manière dans un script ou une commande, se produit, Windows PowerShell vérifie la présence d'une instruction Trap qui gère l'erreur. Si une instruction Trap est présente, Windows PowerShell continue d'exécuter le script ou la commande dans l'instruction Trap. L'exemple suivant est une instruction Trap très facile : trap {"Erreur détectée."} Cette instruction Trap intercepte toute erreur avec fin d'exécution. L'exemple suivant est une fonction qui contient cette instruction Trap : function TrapTest { trap {"Erreur détectée."} nonsenseString } Cette fonction inclut une chaîne fantaisiste " nonsenseString " qui provoque une erreur. L'exécution de cette fonction retourne les éléments suivants : C:\PS> TrapTest Erreur détectée. L'exemple suivant inclut une instruction Trap qui affiche l'erreur en utilisant la variable automatique $_ : function TrapTest { trap {"Erreur détectée : $_"} nonsenseString } L'exécution de cette version de la fonction retourne les éléments suivants : C:\PS> TrapTest Erreur détectée : Le terme " nonsenseString " n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme exécutable. Vérifiez l'orthographe du nom, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est correct et réessayez. Les instructions Trap peuvent également être plus complexes. Une instruction Trap peut inclure plusieurs conditions ou appels de fonction. Il peut enregistrer, tester, ou même exécuter un autre programme. Interruption d'erreurs avec fin d'exécution spécifiées L'exemple suivant est une instruction Trap qui intercepte le type d'erreur CommandNotFoundException : trap [System.Management.Automation.CommandNotFoundException] {"Erreur de commande interceptée"} Lorsqu'une fonction ou un script rencontre une chaîne qui ne correspond pas à une commande connue, cette instruction Trap affiche la chaîne " Erreur de commande interceptée ". Après avoir exécuté toutes les instructions dans la liste d'instruction Trap, Windows PowerShell écrit l'objet erreur dans le flux d'erreurs et reprend l'exécution du script. Windows PowerShell utilise les types d'exception Microsoft .NET Framework. L'exemple suivant spécifie le type d'erreur System.Exception : trap [System.Exception] {"Une erreur interceptée"} Le type d'erreur CommandNotFoundException hérite du type System.Exception. Cette instruction intercepte une erreur créée par une commande inconnue. Elle intercepte également d'autres types d'erreur. Vous pouvez avoir plusieurs instructions Trap dans un script. Chaque erreur peut être interceptée par une seule instruction Trap. Si une erreur se produit tandis que plusieurs instructions Trap sont disponibles, Windows PowerShell utilise l'instruction Trap avec le type d'erreur le plus spécifique qui correspond à l'erreur. L'exemple de script suivant contient une erreur. Le script inclut une instruction Trap générale qui intercepte toute erreur avec fin d'exécution et une instruction Trap spécifique qui détermine le type CommandNotFoundException. trap {"Autre erreur avec fin d'exécution interceptée" } trap [System.Management.Automation.CommandNotFoundException] {"Erreur de commande interceptée"} nonsenseString L'exécution de ce script produit le résultat suivant : Erreur de commande interceptée Le terme " nonsenseString " n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme exécutable. Vérifiez l'orthographe du nom, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est correct et réessayez. À la ligne C:\PS>testScript1.ps1 : 3 Caractère : 19 + nonsenseString <<<< Étant donné que Windows PowerShell ne reconnaît pas " nonsenseString " comme applet de commande ou autre élément, il retourne une erreur CommandNotFoundException. Cette erreur avec fin d'exécution est interceptée par l'instruction Trap spécifique. L'exemple de script suivant contient les mêmes instructions Trap avec une erreur différente : trap {"Autre erreur avec fin d'exécution interceptée" } trap [System.Management.Automation.CommandNotFoundException] {"Erreur de commande interceptée"} 1/$null L'exécution de ce script produit le résultat suivant : Autre erreur avec fin d'exécution interceptée Tentative de division par zéro. À la ligne C:\PS> errorX.ps1 : 3 Caractère : 7 + 1/ <<<< $null La tentative de division par zéro ne crée pas d'erreur CommandNotFoundException. Au lieu de cela, cette erreur est interceptée par l'autre instruction Trap, qui intercepte toute erreur avec fin d'exécution. Interruption des erreurs et portée Si une erreur avec fin d'exécution se produit dans la même portée que l'instruction Trap, après avoir exécuté les instructions Trap, Windows PowerShell reprend l'exécution à l'instruction située après l'erreur. Si l'instruction Trap est dans une portée différente de l'erreur, l'exécution reprend à l'instruction suivante située dans la même portée que l'instruction Trap. Par exemple, si une erreur se produit dans une fonction tandis que l'instruction Trap se situe dans cette même fonction, le script reprend à l'instruction suivante. Par exemple, le script suivant contient une erreur et une instruction Trap : function function1 { trap { "Une erreur : " } NonsenseString "function1 a été effectuée" } Ultérieurement dans le script, l'exécution de la fonction Function1 produit le résultat suivant : function1 Une erreur : Le terme " NonsenseString " n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme exécutable. Vérifiez l'orthographe du nom, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est correct et réessayez. À la ligne C:\PS>TestScript1.ps1 : 3 Caractère : 19 + NonsenseString <<<< function1 a été effectuée L'instruction Trap dans la fonction intercepte l'erreur. Après avoir affiché le message, Windows PowerShell reprend l'exécution de la fonction. Notez que Function1 a été effectuée. Comparez cet exemple avec le suivant, qui présente les mêmes erreur et instruction Trap. Dans cet exemple, l'instruction Trap se produit à l'extérieur de la fonction : function function2 { NonsenseString "function2 a été effectuée" } trap { "Une erreur : " } . . . function2 Ultérieurement dans le script, l'exécution de la fonction Function2 produit le résultat suivant : Une erreur : Le terme " NonsenseString " n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme exécutable. Vérifiez l'orthographe du nom, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est correct et réessayez. À la ligne C:\PS>TestScript2.ps1 : 4 Caractère : 19 + NonsenseString <<<< Dans cet exemple, la commande " function2 a été effectuée " n'a pas été exécutée. Bien que les deux erreurs avec fin d'exécution se produisent à l'intérieur d'une fonction, si l'instruction Trap est à l'extérieur de la fonction, Windows PowerShell ne revient pas dans la fonction après que l'instruction Trap s'est exécutée. Utilisation des mots clés Break et Continue Vous pouvez utiliser les mots clés Break et Continue dans une instruction Trap afin de déterminer si un script ou une commande continue de s'exécuter après une erreur avec fin d'exécution. Si vous incluez une instruction Break dans une liste d'instruction Trap, Windows PowerShell arrête la fonction ou le script. L'exemple de fonction suivante utilise le mot clé Break dans une instruction Trap : C:\PS> function break_example { trap {"Erreur interceptée"; break;} 1/$null "Fonction effectuée." } C:\PS> break_example Erreur interceptée Tentative de division par zéro. À la ligne : 4 Caractère : 7 Étant donné que l'instruction Trap a inclus le mot clé Break, la fonction arrête de s'exécuter et la ligne " Fonction effectuée " n'est pas exécutée. Si vous incluez une instruction Continue dans une instruction Trap, Windows PowerShell reprend après l'instruction qui a provoqué l'erreur, comme il le ferait sans Break ou Continue. Avec le mot clé Continue, toutefois, Windows PowerShell n'écrit pas une erreur dans le flux d'erreurs. L'exemple de fonction suivant utilise le mot clé Continue dans une instruction Trap : C:\PS> function continue_example { trap {"Erreur interceptée"; continue;} 1/$null "Fonction effectuée."} C:\PS> continue_example Erreur interceptée Fonction effectuée. La fonction reprend après avoir intercepté l'erreur, et l'instruction " Fonction effectuée " est exécutée. Aucune erreur n'est écrite dans le flux d'erreurs. VOIR AUSSI about_Break about_Continue about_Throw about_Try_Catch_Finally about_Scopes