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