Try/Catch block dans PowerShell est de gérer les erreurs qui sont produites dans le script. Pour être précis, les erreurs doivent être des erreurs de fin. Le bloc Finally dans le PowerShell n’est pas obligatoire à écrire à chaque fois avec Try/Catch mais il sera exécuté quelle que soit l’erreur qui se produit ou non.
donc, lorsque vous utilisez le bloc Try, le bloc Catch est obligatoire mais pas finalement block.
-
bloc Try/Catch à la Terminaison d’erreur ci-Dessous l’exemple de la Résiliation de l’erreur sans bloc finally.,
exemple
try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}
Output
dans l’exemple ci-dessus, nous avons renvoyé quelque chose qui n’est pas autorisé mais la ligne suivante était authentique bien qu’elle ne puisse pas s’exécuter à cause de l’erreur de fin.
Notre objectif est d’intercepter l’exception et le message d’erreur généré dans le bloc Try. Comme nous le savons, l’erreur est stockée dans $variable d’Erreur. Si vous vérifiez la sortie de la variable error error, vous pouvez obtenir la vue entière, mais chaque fois que vous exécutez un script et que vous gérez les erreurs, assurez-vous d’Effacer les anciennes erreurs à l’aide de $error.,clear() commande ou utiliser la nouvelle console PowerShell. Si vous connaissez l’emplacement spécifique de la variable D’erreur dans un tableau, vous pouvez l’utiliser directement. Par exemple, $error
Nous pouvons voir quelles sont toutes les propriétés de la variable Error Error.
PS C:\WINDOWS\system32> $Error | Get-Member | Select Name, MemberTypeName MemberType---- ----------Equals MethodGetHashCode MethodGetObjectData MethodGetType MethodToString MethodCategoryInfo PropertyErrorDetails PropertyException PropertyFullyQualifiedErrorId PropertyInvocationInfo PropertyPipelineIterationInfo PropertyScriptStackTrace PropertyTargetObject PropertyPSMessageDetails ScriptProperty
Il y a peu de propriétés d’en haut sont utiles pour trouver les détails d’exception et d’erreur. Laissez-les voir et nous pouvons les exploiter dans le bloc de capture ainsi.
première propriété InvocationInfo., Vous pouvez également utiliser Error Error mais c’est la seule erreur générée jusqu’à présent, nous utilisons donc directement Error Error mais vous ne pouvez pas obtenir la fenêtre contextuelle D’AutoSuggestion avec la variable error error directement.
PS C:\WINDOWS\system32> $Error.InvocationInfoMyCommand :BoundParameters : {}UnboundArguments : {}ScriptLineNumber : 3OffsetInLine : 5HistoryId : 50ScriptName :Line : This is not allowedPositionMessage : At line:3 char:5 + This is not allowed + ~~~~PSScriptRoot :PSCommandPath :InvocationName : ThisPipelineLength : 0PipelinePosition : 0ExpectingInput : FalseCommandOrigin : InternalDisplayScriptPosition :
Vous pouvez obtenir les informations spécifiques de Line et PositionMessage comme indiqué ci-dessous.
vérifiez maintenant les propriétés D’Exception.
PS C:\WINDOWS\system32> $Error.ExceptionThe term 'This' 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.
Message d’Exception
PS C:\WINDOWS\system32>$error.Exception.MessageThe term 'This' 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.
Vous pouvez utiliser les autres propriétés que vous pensez être utile d’afficher le message d’erreur. Nous allons utiliser quelques – uns d’entre eux dans le bloc Catch pour attraper l’erreur., Comme nous travaillons avec l’erreur actuelle, nous allons utiliser $_. pour traiter l’erreur/exception actuelle.
Output
Error Message: The term 'This' 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.Error in Line: This is not allowedError in Line Number: 3Error Item Name:
Comme nous l’avons vu ci-dessus, il n’y avait finalement pas de bloc mais Try / Catch a continué à fonctionner. Vous pouvez ajouter le bloc Finally pour effacer vos variables et erreurs et afficher n’importe quel message.
-
bloc Try / Catch avec erreur de non-terminaison.,
Comme nous l’avons vu dans l’exemple ci-dessus, les erreurs de terminaison peuvent être contrôlées avec le bloc Try / Catch, mais les erreurs de non-terminaison ne le peuvent pas car ce sont des applets de commande intégrées et des erreurs générées par les fonctions et la préférence par défaut pour L’action D’erreur est Continue
PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue
pour forcer l’erreur de Non-terminaison à L’erreur de terminaison, nous devons changer la variable er ErrorActionPreference pour arrêter ou utiliser le paramètre ErrorAction avec la valeur Stop., Ici, nous allons utiliser le Paramètre ErrorAction que nous en avons besoin pour une commande spécifique et non pour l’ensemble du script.
Example
Output
Error Message: Cannot find any service with service name 'WhichService'.Error in Line: Get-Service WhichService -ErrorAction StopError in Line Number: 4Error Item Name:This is going to run anyway
comme vous pouvez le voir dans L’exemple ci-dessus, Get-Service produit L’erreur de non –terminaison et nous pouvons la convertir en erreur de terminaison par le paramètre Stop-ErrorAction et la même exception a été interceptée par Catch Block.
-
la gestion Manuelle Exception Spécifique
Si vous souhaitez gérer un type d’exception spécifique, alors vous pouvez fournir le nom de l’exception dans le bloc catch., Pour connaître le nom de l’exception, vous devez obtenir la propriété de la variable Error Error et c’est GetType(). Dans l’exemple ci-dessous, nous devons trouver le nom de l’exception à partir de la sortie d’erreur ci-dessous.
exemple
supposons que votre erreur soit stockée dans la variable Error Error, vous devez exécuter la commande ci-dessous pour obtenir le nom de l’exception à utiliser dans le bloc catch.
$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException
Vous avez obtenu le nom du type d’exception avec la commande ci-dessus, vous pouvez utiliser le même dans le bloc catch afin que le bloc catch n’attrape que cette exception spécifique.,
sortie
-
attraper plusieurs exceptions PowerShell.
Vous pouvez également prendre le plusieurs exceptions dans PowerShell. Pour cela, vous pouvez utiliser un seul bloc Try et plusieurs blocs catch.
exemple
sortie
Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value
ici, dans la première commande, elle-même erreur générée pour que la commande suivante ne s’exécute pas. Si la première commande ne génère aucune erreur, la commande suivante sera vérifiée et si l’exception se produit, Catch avec ce bloc d’exception spécifique sera exécuté.,
Si vous ne voulez pas gérer plusieurs exceptions et que vous avez toujours besoin de certaines commandes, les erreurs peuvent être ignorées mais ne doivent pas passer par le bloc catch afin que la commande suivante puisse s’exécuter, vous pouvez utiliser Ignore ou SilentlyIgnore dans le paramètre ErrorAction.