502 votes

Python : Comment ignorer une exception et poursuivre ?

J'ai un bloc try...except dans mon code et quand une exception est lancée. Je veux vraiment continuer avec le code parce que dans ce cas, tout est encore capable de s'exécuter parfaitement. Le problème est que si vous laissez le bloc except vide ou avec un #do nothing, vous obtenez une erreur de syntaxe. Je ne peux pas utiliser continue parce que ce n'est pas dans une boucle. Y a-t-il un mot clé que je puisse utiliser pour dire au code de continuer ?

743voto

Andy Hume Points 15186

92 votes

Except Exception : pass # important de ne pas avaler d'autres exceptions !

26 votes

Cela permettra d'attraper SystemExit, KeyboardInterrupt et d'autres choses que vous ne voulez probablement pas attraper.

2 votes

Il n'attrapera pas KeyboardInterrupt. Par exemple : while True: try: f = open('filedoesnotexist.txt')` except: pass KeyboardInterrupt arrête et quitte le code.

314voto

tzot Points 32224

Réponse générique

Le "nop" standard en Python est la fonction pass déclaration :

try:
    do_something()
except Exception:
    pass

Utilisation de except Exception au lieu d'un simple except éviter d'attraper des exceptions comme SystemExit , KeyboardInterrupt etc.

Python 2

En raison de la mémorisation de la dernière exception levée dans Python 2, certains des objets impliqués dans l'instruction de levée d'exception sont maintenus en vie indéfiniment (en fait, jusqu'à la prochaine exception). Si cela est important pour vous et que (généralement) vous n'avez pas besoin de vous souvenir de la dernière exception levée, vous pouvez faire ce qui suit au lieu de pass :

try:
    do_something()
except Exception:
    sys.exc_clear()

Cela efface la dernière exception lancée.

Python 3

En Python 3, la variable qui contient l'instance de l'exception devient supprimé à la sortie du except bloc. Même si la variable avait une valeur auparavant, après l'entrée et la sortie du bloc except le bloc devient indéfini encore.

46 votes

Cette réponse est meilleure que celle qui a été acceptée parce qu'elle utilise "except Exception :" au lieu de "except :" qui, comme d'autres l'ont fait remarquer, englobe de manière inappropriée d'autres choses que vous ne voulez pas attraper comme SystemExit et KeyboardInterrupt.

4 votes

+1 Il efface également l'erreur, ce qui est important lorsque l'on exécute des unittests et que l'on attend des exceptions.

7 votes

Notez que exc_clear a été supprimé dans python 3. docs.python.org/3/whatsnew/3.0.html#index-22 . Pour connaître les moyens de résoudre ce problème dans Python 3, voir ici : cosmicpercolator.com/2016/01/13/

254voto

Jack O'Connor Points 1165

Une nouvelle façon de le faire est prévue dans Python 3.4 :

from contextlib import suppress

with suppress(Exception):
  # your code

Voici le commit qui l'a ajouté : http://hg.python.org/cpython/rev/406b47c64480

Et voici l'auteur, Raymond Hettinger, qui parle de cette question et de toutes sortes d'autres sujets brûlants liés à Python (passage pertinent à 43:30) : http://www.youtube.com/watch?v=OSGv2VnC0go

Si vous vouliez émuler le nu except et ignorent également les éléments tels que KeyboardInterrupt -bien que vous ne le fassiez pas d'habitude, vous pourriez utiliser with suppress(BaseException) .

Edit : Looks like ignored a été renommé en suppress avant la sortie de la version 3.4.

2 votes

Je ne suis pas sûr d'aimer cette solution... Je suppose que l'idée est de remplacer 3 lignes par une seule (les try, except et pass sont tous fusionnés en une seule). La principale chose que je conteste est l'introduction d'un nouveau mot-clé qui semble justifier quelque chose que vous ne devriez probablement pas faire... il semble que vous devriez toujours au moins enregistrer les exceptions que vous attrapez...

0 votes

Lorsqu'une exception est levée, le code se poursuit-il après le try/catch ou ce qui se trouve à l'extérieur de l'environnement de l'exception ? with bloc ?

5 votes

Cela équivaut à envelopper votre code dans une balise try...catch: pass Ainsi, si une exception est levée à l'intérieur du bloc, l'exécution se poursuivra après la fin du bloc.

23voto

ryeguy Points 24980

Essayez ça :

try:
    blah()
except:
    pass

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X