Question trap et étendue

Plus d'informations
il y a 16 ans 4 mois #5685 par steph_d
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 :laugh: ).
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.

Plus d'informations
il y a 16 ans 4 mois #5687 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:trap et étendue
Salut,
steph_d écrit:

Y'a-t-il un moyen de faire autrement ?

Tu peux créer une portée locale à l'aide d'un scriptblock :
[code:1]
function Test ()
{

trap {
Write-Warning \&quot;Trap global\&quot;
Write-host $_.Exception.Message
Continue
}

Function LireLigneCDC($nb)
{
foreach ($J in $nb..$nb+2)
{
trap {
Write-Warning \&quot;Trap imbriqué\&quot;
Write-host \&quot;Pour J= $J `r`n $($_.Exception.Message)\&quot;
continue
}
$J / 0
}

Write-Host \&quot;Suite LireLigneCDC\&quot; -fore green
}


&amp;{
trap {
Write-Warning \&quot;Trap local\&quot;
Write-host \&quot;Pour i= $i `r`n $($_.Exception.Message)\&quot;
continue
}
Write-Host \&quot;Scriptblock\&quot; -fore White
foreach ($i in 1..2)
{
LireLigneCDC $i
&amp;\&quot;c:\Windows\Inner.exe\&quot;
}#foreach
} #sb
Write-Host \&quot;Main\&quot; -fore White
&amp;\&quot;c:\Windows\Outer.exe\&quot;
}#test

Test
[/code:1]
Le corps de la boucle foreach crée une portée locale {}.
Pour le scriptblock l'usage du &amp; 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 :P<br><br>Message édité par: Laurent Dardenne, à: 20/11/09 11:41

Tutoriels PowerShell

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

Plus d'informations
il y a 16 ans 3 mois #5709 par steph_d
Réponse de steph_d sur le sujet Re:trap et étendue
Donc avec le &amp;{ Si j'ai une erreur dans la fonction LireLigneCDC le programme continuera dans la boucle avec la prochaine valeur de $i ?

Stephane

@+ Steph

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

Plus d'informations
il y a 16 ans 3 mois #5710 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:trap et étendue
steph_d écrit:

Donc avec le &amp;{ Si j'ai une erreur dans la fonction LireLigneCDC le programme continuera dans la boucle avec la prochaine valeur de $i ?

Oui c'est + ou - cela :
\&quot;Si j'ai une erreur dans la fonction LireLigneCDC le programme continuera dans la boucle avec la prochaine valeur de $i.\&quot;
La fonction LireLigneCDC gére ces propres erreurs et le scriptblock &amp;{ 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.044 secondes
Propulsé par Kunena