Try Catch

Comme vous le savez peut-être, on peut récupérer une erreur bloquante de cette façon:

 

$ErrorActionPreference = "Stop"

try
{
    Get-CommandeInexistante
}
catch
{
    $_
}

Le résultat affiché ressemblera à ceci:

get-CommandeInexistante : The term 'get-CommandeInexistante' 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.
At line:1 char:5
+ try{get-CommandeInexistante}catch{$_}
+     ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (get-CommandeInexistante:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Voilà pour la base.

Try Catch filtré

C’est bien joli tout ça mais imaginons que l’on veuille effectuer des actions différentes suivant le type d’erreur…

Et bien c’est possible !

Imaginons  l’exemple suivant, où le fichier “Fichier.txt” n’existe pas:

$ErrorActionPreference = "Stop"
$Fichier = "C:\Temp\Fichier.txt"


try
{
    $Test1 = Get-Item C:\Temp\Fichier.txt
    $Test2 = Get-CommandeInexistante
}
catch [System.Management.Automation.CommandNotFoundException]
{
    Write "Commande non-trouvée"
}
catch [System.Management.Automation.ItemNotFoundException]
{
    Write "Objet non-trouvé"
    New-Item $Fichier -ItemType File -Force
}
catch
{
    Write "Erreur non-filtrée"
}

 

Et voilà le résultat:

Objet non-trouvé


    Directory: C:\Temp


Mode                LastWriteTime         Length Name                                                                                                                                         
----                -------------         ------ ----                                                                                                                                         
-a----        5/23/2018   3:46 PM              0 Fichier.txt                                                                                                                                  

Donc ici on voit bien que c’est le catch suivant qui s’est exécuté et pas les autres:

catch [System.Management.Automation.ItemNotFoundException]
{
    Write "Objet non-trouvé"
    New-Item $Fichier -ItemType File -Force
}

 

On vient donc de crée le fichier manquant… relançons le script ! Le résultat en sortie est désormais:

Commande non-trouvée

On comprend donc ici que le catch agit dès qu’il rencontre une erreur et arrête le script, donc si il y a 3 erreurs par exemple, le try ne traitera que la première.

Récupérer le type d’erreur

Une inconnue suite au point précédent, c’est comment trouver le nom de ce genre d’exception : “[System.Management.Automation.ItemNotFoundException]” ?

Comme ceci tout simplement:

$ErrorActionPreference = "Stop"

try
{
    Get-CommandeInexistante
}
catch
{
    $_.Exception.GetType().FullName
}

Le résultat est le nom du type d’exception généré par l’erreur:

System.Management.Automation.CommandNotFoundException

PS:

Je travaille selon mes dispos sur plusieurs ressources que je compte mettre à votre disposition, l’une d’en être est mon système de log, parmi ses atouts, il est capable de récupérer toute sorte d’info dans une erreur généré dans un try catch et convertir ça en log. Je n’en dirai pas plus pour le moment alors soyez patients 😉


0 commentaire

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *