Question
trap et étendue
- steph_d
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 65
- Remerciements reçus 0
il y a 16 ans 4 mois #5685
par steph_d
@+ Steph
trap et étendue a été créé par steph_d
Bonjour les gens
Je pense avoir bien compris comment ça fonctionnait (grâce au super bouquin
).
Par contre ça fait pas ce que je veux et je voudrai bien que ce soit le cas.
Mon prog:
[code:1]
. ./GestionErreur.ps1 #Contient la fonction Set-TrapMail
trap {
#Avec tout un tas de commande
Set-trapMail
Continue
}
Function LireLigneCDC()
{
ForEach # 1
{
#C'est ici que se produit mon erreur
}
}
#Programme principale
Foreach # 2
{
LireLigneCDC()
}
[/code:1]
Mon souci c'est que lorsque mon erreur se produit, je sors de la boucle ForEach 1, de la fonction et de la boucle ForEach 2. Je ne voudrai pas sortir du Foreach 2.
Pour ça j'ai rajouté un trap { Continue } dans la fonction, mais ça me plait pas car en plus il faut que je recopie le contenu de mon trap principale ou que je créé une fonction à appeler dans les 2 traps.
Y'a-t-il un moyen de faire autrement ?
Merci
Stephane<br><br>Message édité par: steph_d, à: 20/11/09 10:30
Je pense avoir bien compris comment ça fonctionnait (grâce au super bouquin
Par contre ça fait pas ce que je veux et je voudrai bien que ce soit le cas.
Mon prog:
[code:1]
. ./GestionErreur.ps1 #Contient la fonction Set-TrapMail
trap {
#Avec tout un tas de commande
Set-trapMail
Continue
}
Function LireLigneCDC()
{
ForEach # 1
{
#C'est ici que se produit mon erreur
}
}
#Programme principale
Foreach # 2
{
LireLigneCDC()
}
[/code:1]
Mon souci c'est que lorsque mon erreur se produit, je sors de la boucle ForEach 1, de la fonction et de la boucle ForEach 2. Je ne voudrai pas sortir du Foreach 2.
Pour ça j'ai rajouté un trap { Continue } dans la fonction, mais ça me plait pas car en plus il faut que je recopie le contenu de mon trap principale ou que je créé une fonction à appeler dans les 2 traps.
Y'a-t-il un moyen de faire autrement ?
Merci
Stephane<br><br>Message édité par: steph_d, à: 20/11/09 10:30
@+ Steph
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 4 mois #5687
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:trap et étendue
Salut,
steph_d écrit:
[code:1]
function Test ()
{
trap {
Write-Warning \"Trap global\"
Write-host $_.Exception.Message
Continue
}
Function LireLigneCDC($nb)
{
foreach ($J in $nb..$nb+2)
{
trap {
Write-Warning \"Trap imbriqué\"
Write-host \"Pour J= $J `r`n $($_.Exception.Message)\"
continue
}
$J / 0
}
Write-Host \"Suite LireLigneCDC\" -fore green
}
&{
trap {
Write-Warning \"Trap local\"
Write-host \"Pour i= $i `r`n $($_.Exception.Message)\"
continue
}
Write-Host \"Scriptblock\" -fore White
foreach ($i in 1..2)
{
LireLigneCDC $i
&\"c:\Windows\Inner.exe\"
}#foreach
} #sb
Write-Host \"Main\" -fore White
&\"c:\Windows\Outer.exe\"
}#test
Test
[/code:1]
Le corps de la boucle foreach crée une portée locale {}.
Pour le scriptblock l'usage du & crée les objets (variables,fonctions) dans la portée courante, et l'usage du point . les crée dans la portée parente.
Et comme c'est bientot noël, j'en ai profité pour y mettre un peu de couleurs
<br><br>Message édité par: Laurent Dardenne, à: 20/11/09 11:41
steph_d écrit:
Tu peux créer une portée locale à l'aide d'un scriptblock :Y'a-t-il un moyen de faire autrement ?
[code:1]
function Test ()
{
trap {
Write-Warning \"Trap global\"
Write-host $_.Exception.Message
Continue
}
Function LireLigneCDC($nb)
{
foreach ($J in $nb..$nb+2)
{
trap {
Write-Warning \"Trap imbriqué\"
Write-host \"Pour J= $J `r`n $($_.Exception.Message)\"
continue
}
$J / 0
}
Write-Host \"Suite LireLigneCDC\" -fore green
}
&{
trap {
Write-Warning \"Trap local\"
Write-host \"Pour i= $i `r`n $($_.Exception.Message)\"
continue
}
Write-Host \"Scriptblock\" -fore White
foreach ($i in 1..2)
{
LireLigneCDC $i
&\"c:\Windows\Inner.exe\"
}#foreach
} #sb
Write-Host \"Main\" -fore White
&\"c:\Windows\Outer.exe\"
}#test
Test
[/code:1]
Le corps de la boucle foreach crée une portée locale {}.
Pour le scriptblock l'usage du & crée les objets (variables,fonctions) dans la portée courante, et l'usage du point . les crée dans la portée parente.
Et comme c'est bientot noël, j'en ai profité pour y mettre un peu de couleurs
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- steph_d
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 65
- Remerciements reçus 0
il y a 16 ans 3 mois #5709
par steph_d
@+ Steph
Réponse de steph_d sur le sujet Re:trap et étendue
Donc avec le &{ Si j'ai une erreur dans la fonction LireLigneCDC le programme continuera dans la boucle avec la prochaine valeur de $i ?
Stephane
Stephane
@+ Steph
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 3 mois #5710
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:trap et étendue
steph_d écrit:
\"Si j'ai une erreur dans la fonction LireLigneCDC le programme continuera dans la boucle avec la prochaine valeur de $i.\"
La fonction LireLigneCDC gére ces propres erreurs et le scriptblock &{ est utilisé pour les erreurs dans la boucle appelant la fonction LireLigneCDC.
Son usage permet de placer sur une portion de code une gestion d'exception locale. Sans sa présence ce serait le trap global qui se déclencherait en cas d'erreur dans la boucle appelant la fonction LireLigneCDC.
C'est vrai que cela obscurcit le code, mais c'est un défaut de la V1. La v2 améliore la gestion des erreurs, mais il reste des cas qui posent pb...
Oui c'est + ou - cela :Donc avec le &{ Si j'ai une erreur dans la fonction LireLigneCDC le programme continuera dans la boucle avec la prochaine valeur de $i ?
\"Si j'ai une erreur dans la fonction LireLigneCDC le programme continuera dans la boucle avec la prochaine valeur de $i.\"
La fonction LireLigneCDC gére ces propres erreurs et le scriptblock &{ est utilisé pour les erreurs dans la boucle appelant la fonction LireLigneCDC.
Son usage permet de placer sur une portion de code une gestion d'exception locale. Sans sa présence ce serait le trap global qui se déclencherait en cas d'erreur dans la boucle appelant la fonction LireLigneCDC.
C'est vrai que cela obscurcit le code, mais c'est un défaut de la V1. La v2 améliore la gestion des erreurs, mais il reste des cas qui posent pb...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.045 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- trap et étendue