continue foreach loopból catch ágból

0 votes
asked Apr 7, 2013 in IRF tantárgy by balazon (35 points)  

Van egy fv-em :

Function myfunction ($var){
   #elvileg csinál nekem egy sessiont, amit visszaad, 
   #de ez most gondolom lényegtelen
  $sess = new-cimsession ..
   return $sess
}

Van egy foreach ciklusom, kb így néz ki:

foreach($var in $iterable) {
   try {
   $s = myfunction $var
  }catch{
    write-output "nem sikerült a session";
    continue;
  }

  #mas utasitasok

}

De nem akar összejönni az, hogy ha valami hiba lép fel a session létrehozásánál, akkor valahogy folytassa a ciklust a következő elemmel.

Egészen fura helyeken bukkan fel az épp végrehajtandó utasítás debuggoláskor. Próbáltam trap-et is használni, illetve return-t a continue helyett, nem sikerült, kicsit zavaros már az egész trap try catch exception rendszer.
Tud erre valaki valamit?

Olyan, mintha a continue-ra egyszerüen az error fajta continue-t használná, ami azt jelenti, hogy egyszerüen továbbmegy a hiba utáni sortól (a #mas utasitasok felé). ha labelt írok a ciklushoz, azzal sem megy.

2 Answers

0 votes
answered Apr 8, 2013 by anonymous  

A kritikus kódrész van a try blokkban. Ha itt bármilyen okból kifolyólag kivétel keletkezik, akkor a program futása a catch ágban folytatódik.
Miért akarsz catch ágban continue-elni? Azzal kilépsz a ciklusodból.
Miért nem veszed ki a continue-t?
Ha meg az a gondod, hogy kivétel elkapása után a #mas utasítások felé megy, akkor azt is miért nem rakod bele a kritikus blokkba (try)?

0 votes
answered Apr 9, 2013 by balazon (35 points)  

Continue-t azért akartam ugye használni, hogy a ciklusban továbbmenjen rögtön a következő elemre, és azért kellett a try catch felülre, mert ott még be kellett fejeznem egy xml írást , és így tudtam, hogy hány elemhez kellett writeendelement. (Hiszen biztosan lehetett volna tudni, hogy honnan kaptam az exceptiont - persze exception szögekekkel ezt finomíthattam volna, és akkor ha az egészet berakom try blokkba, azzal úgy nem kellett volna continue)
Most viszont rájöttem, a continue teljesen jól működött

A probléma az volt, hogy valójában be sem lépett a catch ágba, szerintem nem is dobott exceptiont, hanem csak azzal az $error változóval vagy hogyan írt piros hibát a new-cimsession

A megoldás az volt végülis, hogy a függvényben a sessiont létrehozó sor után egy if-ben megnéztem, hogy jól lefutott-e az utasítás , és ha nem : ha $? -eq $false, vagy csak simán ha (!$?) , akkor dobtam egy hibát : throw "valami", így azt el tudtam kapni.

De a piros szöveget még valahogyan jó lenne elkapnom, mert nem tünik tul felhasználó barátnak, majd utánanézek

commented Apr 11, 2013 by tuzkoandras (91 points)  
Sikerült elkapnod valahogy az említett piros üzenetet? Keresem már egy jó ideje, de nem megy.
Köszi
commented Apr 14, 2013 by kviktor (84 points)  
Sikerült elkapni a piros szöveget?

Egy sima !$session-el megy az ellenőrzés nekem, tehát tovább nem megy, de a piros szöveg marad :/
commented Apr 14, 2013 by tuzkoandras (91 points)  
Használj egy -EA SilentlyContinue paramétert a New-CimSession utasításban, ez elnyomja az error üzenetet
...