Question [Tutoriel] La gestion des erreurs sous PowerShell

Plus d'informations
il y a 8 ans 1 mois #15857 par Laurent Dardenne
Salut,
voici un tutoriel sur la gestion des erreurs sous PowerShell .
Les sources .


Le sommaire :

1 L’ERREUR EST HUMAINE 4
2 LES FLUX A DISPOSITION DANS POWERSHELL 5
2.1 ERREUR SIMPLE ET ERREUR BLOQUANTE 5
2.1.1 Comportement d’une erreur 5
2.1.2 Comportement d’une erreur bloquante 6
2.2 FLUX D’ERREUR 7
3 PRINCIPE DES EXCEPTIONS 7
3.1 CONCEPT D’EXCEPTION 9
3.1.1 Usage 9
3.2 DECLENCHER UNE ERREUR 10
3.3 DECLENCHER UNE ERREUR BLOQUANTE 10
3.3.1 Propager la cause réelle d’une erreur 11
4 MODIFIER LE COMPORTEMENT DE LA GESTION D’ERREUR 13
4.1 LA STRUCTURE ERRORRECORD 14
4.2 MODIFIER LE COMPORTEMENT DE WRITE-ERROR 15
4.3 MODIFIER L’AFFICHAGE DES MESSAGES D’ERREUR 17
4.4 MODIFIER D’AUTRES COMPORTEMENTS 19
5 LA CONSTRUCTION D’UN GESTIONNAIRE D’EXCEPTION 19
5.1 TRY 19
5.2 CATCH 20
5.2.1 Accès à l’objet Exception 20
5.2.2 Comportement avec une erreur simple 20
5.2.3 Une construction à éviter 21
5.2.4 Capture par type d’exception 22
5.2.1 Redéclenchement d’exception 24
5.2.2 Gestion d’exception dans le pipeline 24
5.2.3 Comment déterminer les exceptions à capturer 25
5.3 FINALLY 26
5.4 PROPAGATION DES EXCEPTIONS IMPREVUES 28
5.5 L’INSTRUCTION TRAP 29
6 PARAMETRES COMMUNS DE CMDLET OU DE FONCTION LIES AUX ERREURS 29
6.1 ERRORACTION 29
6.2 ERRORVARIABLE 29
6.3 WARNINGVARIABLE 30
6.4 COMMENT IMPLEMENTER CE TYPE DE VARIABLE ? 30
7 GESTIONNAIRE D’EXCEPTION GLOBALE 31
8 GENERER DES CLASSES D’EXCEPTION 32
8.1 TYPE D’EXCEPTION UTILISABLE 32
8.2 CREER SES PROPRES EXCEPTIONS 32
9 QUELQUES OPERATIONS RECURRENTES 34
9.1 TESTER SI UNE ERREUR A EU LIEU 34
9.2 DETERMINER LE RETOUR D’EXECUTION D’UNE COMMANDE 34
9.3 REDIRECTION D’ERREUR 35
9.4 FLUX STANDARD 37
9.4.1 Les nouveaux flux sous Powershell version 3 37
9.5 PROPRIETE DE FORMATAGE 38
10 CONCLUSION 38


Bonne lecture.
[Ajout]


Un piège autour de l'instruction Catch et de l'exception System.Management.Automation.RuntimeException.

Le dernier bloc Catch n'est jamais exécuté, car le premier bloc Catch gére toutes les exceptions.
Selon les spécifications de PS : 'Each exception thrown is raised as a System.Management.Automation.RuntimeException'
[code:1]
try {
#[NotExist]> $Null
Throw (New-Object System.ApplicationException(\"Error.\"«»))
} catch [System.Management.Automation.RuntimeException] {
Write-Warning \"Exception type : $($_.Exception.GetType())\"
}Catch {
Write-Warning \"Autre\"
}
#AVERTISSEMENT : Exception type : System.ApplicationException
[/code:1]
Si on décommente la première ligne qui déclenche bien l'exception System.Management.Automation.RuntimeException, on obtient :
[code:1]
#AVERTISSEMENT : Exception type : System.Management.Automation.RuntimeException
[/code:1]
Une solution pour gérer ce cas :
[code:1]
try {
#[NotExist]> $Null
Throw (New-Object System.ApplicationException(\"Error.\"«»))

} catch [System.ApplicationException] {
Throw $_ #Gére ce type d'exception et la redéclenche
}
} catch [System.Management.Automation.RuntimeException] {
Write-Warning \"Exception type : $($_.Exception.GetType())\"
}
[/code:1]
Ici on ne gère que deux cas d'exceptions.

Une autre solution :
[code:1]
try {
[NotExist]> $Null
Throw (New-Object System.ApplicationException(\"Error.\"«»))
}Catch {
if ($_.Exception -is [System.Management.Automation.RuntimeException])
{ Write-Warning 'Gére [System.Management.Automation.RuntimeException]'}
else
{ Throw $_ } #Redéclenche toutes les autres exceptions
}
[/code:1]

Pour aller plus loin .

La version 3 ajoute la propriété ScriptStackTrace contenant la pile d'appel du code Powershell et celle pas des API dotNET ($StackTrace).
Un bug selon le contexte d'appel

Bug avec $ErrorActionPreference = 'Ignore'

' Bug ' autour de throw et $ErrorActionPrference='SilentlyContinue'

Message édité par: Laurent Dardenne, à: 9/02/15 16:19

Message édité par: Laurent Dardenne, à: 17/02/16 19:46

Message édité par: Laurent Dardenne, à: 27/09/16 13:10

Message édité par: Laurent Dardenne, à: 17/02/17 13:59

Message édité par: Laurent Dardenne, à: 28/07/17 09:15<br><br>Message édité par: Laurent Dardenne, à: 17/06/19 13:02

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 8 ans 1 mois #15865 par laucaz
Merci Laurent pour ce Tuto tres tres interessant pour des \&quot;jeunes Padawan\&quot; comme moi :-)

@+
Laurent

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 8 ans 1 mois #15866 par Laurent Dardenne
titou4 écrit:

Merci Laurent pour ce Tuto

De rien.
Il faut tout de même un peu de temps pour mémoriser ces nombreuses informations.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 8 ans 1 mois #15870 par Matthew BETTON
Merci Laurent pour ce tuto très intéressant et fort utile. Une référence ;)

@ +

Matthew

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 8 ans 1 mois #15874 par Laurent Dardenne
Matthew BETTON écrit:

Une référence

On verra...
Il manque la gestion des erreurs du remoting et qq conseils pratiques.
Il reste peut être un ou deux bugs dans les sources proposés, je dois vérifier ça prochainement.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 8 ans 1 mois #15876 par Matthew BETTON
Laurent Dardenne écrit:

Matthew BETTON écrit:

Une référence

On verra...
Il manque la gestion des erreurs du remoting et qq conseils pratiques.
Il reste peut être un ou deux bugs dans les sources proposés, je dois vérifier ça prochainement.


Comme tu l'indiques \&quot;Il faut tout de même un peu de temps pour mémoriser ces nombreuses informations.\&quot;.

Ton document peut évoluer. Et quand bien même, il contient déjà de nombreuses informations :)

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.121 secondes
Propulsé par Kunena