2012-06-02 3 views
0

Existe-t-il un moyen d'empêcher les exceptions StopIteration d'être rejetées à partir d'un code indépendant (sans avoir à les attraper manuellement)?Comment éviter que StopIteration ne soit intercepté?

Exemple: loop_all veut parcourir en boucle l'itérateur myiter et passer simplement à la fin de celui-ci. Cela fonctionne à moins que some_dangerous_method ou tout autre code dans myiter déclenche un StopIteration.

def loop_all(): 
    myiter = myiter() 
    try: 
     while True: 
      next(myiter) # <- I want exactly the StopIteration from this next method 
    except StopIteration: 
     pass 

def myiter(): 
    some_dangerous_method() # what if this also raises a StopIteration? 
    for i in some_other_iter(): 
     # here may be more code 
     yield 

est-il un moyen de faire comprendre à qui StopIteration le code devrait réagir?

+2

Pourquoi pensez-vous que vous aurez jamais obtenir un 'StopIteration' d'ailleurs? C'est comme si vous attendiez un appel stdlib aléatoire, comme l'échec de l'heure actuelle ou d'un nombre aléatoire ... – ThiefMaster

+0

Ceci est un exemple concret, mais il est vrai que je n'avais jamais pensé à ce genre de chose. – Debilski

+0

En outre, il existe plusieurs méthodes qui appellent le code tiers. Je ne veux pas faire un crochet à moins qu'il n'y ait vraiment, vraiment pas d'autre moyen. – Debilski

Répondre

3

Si une fonction que vous appelez appelle next (iter) et ne traite pas StopIteration, alors cette fonction a un bug. Répare le.

+0

Comme je l'ai écrit ci-dessus, la fonction appelle un code tiers qui peut invoquer 'next (iter)'. Il est censé écraser le tout dans ce cas et ne pas le faire se comporter d'une manière étrange. – Debilski

+1

Si le code tiers déclenche 'StopIteration', alors vous n'avez pas de chance. Il n'y a aucun moyen de distinguer quelle itération se termine. Obtenez le code tiers corrigé. –

1

Peut-être que je manque quelque chose, mais pourquoi ne pas simplement ceci:

def myiter(): 
    try: 
     some_dangerous_method() 
    except StopIteration: 
     pass # or raise a different exception 
    for i in some_other_iter(): 
     # here may be more code 
     yield 
+0

C'est plus un correctif qu'une solution. – Debilski

+0

@Debilski Une solution plus complète consiste à créer votre propre classe wrapper qui enroule individuellement toutes les méthodes nécessaires de la classe dangereuse avec des sauvegardes appropriées. –

Questions connexes