2017-08-02 1 views
0
for i in range(1,1000): 
    try: 
     x = some_crazy_function(my_parm(i)) 
     if x in massive: 
      raise Exception() 
     massive.append(x) 
     x = dict(qnother_crazy_functionsl(x.replace('X','Y'))) 
     x = new_func(x['constant'])[0] 
     next.append(x) 
    except: 
     break 

Je suis assez nouveau pour python et j'ai couru traverser ce fragment tout en maintenant quelqu'un d'autre codeEst-ce la bonne façon de déclencher une exception? (Python)

Pour moi, qui ressemble à une façon horrible de sortir d'une boucle. Est-ce la manière acceptée de coder en python et je vais m'y habituer ou est-ce aussi mauvais qu'il en a l'air?

+0

Des exceptions sont générées lorsque votre code rencontre quelque chose d'anormal. Il n'y a rien d'anormal à propos du fait que 'x' soit dans' massive' - à moins, bien sûr, que vous attendiez normalement que 'x' _not_ soit dans' massive'. Au niveau performance, les exceptions sont très chères. Donc, utilisez 'break' à la place. – DyZ

+0

L'utilisation du 'except:' est également une mauvaise idée, car elle capture également 'KeyboardInterrupt' et quelques autres choses que vous ne voulez probablement pas attraper. – kindall

Répondre

1

Dans le plus simple des cas, break serait le meilleur (et le plus simple) moyen de sortir d'une boucle:

if x in massive: 
    break 

Cependant, si lancer et attraper une exception est plus apte à votre cas d'utilisation , je recommanderais d'abord définir votre propre classe d'exception définie par l'utilisateur:

class MassiveException(Exception): 
    pass 

Ensuite, vous pouvez jeter comme ceci:

if x in massive: 
    raise MassiveException() 

Et par conséquent l'attraper comme ceci:

except MassiveException: 
    ... # do something here 

Cela vaut mieux, car il rend votre intention claire et aussi se débarrasse des fourre-tout, sauf ce qui avaler d'autres exceptions vous vraiment n » Je veux avaler.

+0

Merci à tous. Comme je l'ai dit, cela ressemblait à une mauvaise façon de coder, et vos réponses sembleraient renforcer mon sentiment. Merci pour les extraits de code pour une meilleure façon d'implémenter ce fragment. – Don

+0

@Don Si cela vous a aidé, veuillez considérer le marquer comme accepté. Merci! –

+0

re: accepté Désolé mais si je comprends le concept, je suis désemparé sur la mise en œuvre. et comment puis-je obtenir un saut de ligne ici? – Don