Comment ignorer les exceptions

quand vous voulez juste faire un essai-sauf sans Gérer l'exception, Comment faites-vous en Python?

Est la suite de la bonne façon de le faire?

try:
    shutil.rmtree(path)
except:
    pass
618
demandé sur Peter Mortensen 2009-04-08 20:23:00

11 réponses

try:
  doSomething()
except: 
  pass

ou

try:
  doSomething()
except Exception: 
  pass

la différence est que le premier attrapera aussi KeyboardInterrupt , SystemExit et des trucs comme ça, qui sont dérivés directement de exceptions.BaseException , pas exceptions.Exception .

voir documentation pour plus de détails:

866
répondu vartec 2009-04-08 16:37:49

il est généralement considéré comme une bonne pratique de ne saisir que les erreurs qui vous intéressent. Dans le cas de shutil.rmtree c'est probablement OSError :

>>> shutil.rmtree("/fake/dir")
Traceback (most recent call last):
    [...]
OSError: [Errno 2] No such file or directory: '/fake/dir'

si vous voulez ignorer silencieusement cette erreur, vous feriez:

try:
    shutil.rmtree(path)
except OSError:
    pass

pourquoi? Disons que vous (en quelque sorte) passez accidentellement la fonction un entier au lieu d'une chaîne, comme:

shutil.rmtree(2)

il donnera l'erreur " TypeError: coercing pour Unicode: besoin de chaîne ou de buffer, int a trouvé " - vous ne voulez probablement pas ignorer cela, qui peut être difficile à déboguer.

Si vous certainement voulez ignorer toutes les erreurs, attraper Exception plutôt qu'un simple except: . Encore une fois, pourquoi?

ne précisant pas d'exception captures chaque exception, y compris la SystemExit exception qui, par exemple sys.exit() utilisations:

>>> try:
...     sys.exit(1)
... except:
...     pass
... 
>>>

comparez ceci à ce qui suit, qui sort correctement:

>>> try:
...     sys.exit(1)
... except Exception:
...     pass
... 
shell:~$ 

si vous voulez écrire un code de comportement toujours meilleur, l'exception OSError peut représenter diverses erreurs, mais dans l'exemple ci-dessus nous ne voulons ignorer Errno 2 , donc nous pourrions être encore plus spécifique:

try:
    shutil.rmtree(path)
except OSError, e:
    if e.errno == 2:
        # suppress "No such file or directory" error
        pass
    else:
        # reraise the exception, as it's an unexpected error
        raise

vous pouvez aussi import errno et changer le if à if e.errno == errno.ENOENT:

120
répondu dbr 2017-09-25 09:58:57

quand vous voulez juste faire un essai sans Gérer l'exception, Comment faites-vous en Python?

cela dépend de ce que vous entendez par "manipulation"."

Si vous voulez attraper sans prendre des mesures, le code que vous avez posté fonctionnera.

si vous voulez dire que vous voulez prendre des mesures sur une exception sans empêcher l'exception de monter la pile, alors vous voulez quelque chose comme ceci:

try:
    do_something()
except:
    handle_exception()
    raise  #re-raise the exact same exception that was thrown
107
répondu Jason Baker 2009-04-08 16:32:32

je cite D'abord la réponse de Jack o'Connor dans ce fil . Le fil référencé s'est fermé donc j'écris ici:

"il y a une nouvelle façon de faire cela en 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, parlant de ceci et de toutes sortes d'autres Pythons chaleur: https://youtu.be/OSGv2VnC0go?t=43m23s

mon ajout à ceci est L'équivalent Python 2.7:

from contextlib import contextmanager

@contextmanager
def ignored(*exceptions):
    try:
        yield
    except exceptions:
        pass

alors vous l'utilisez comme dans Python 3.4:

with ignored(Exception):
    # your code
65
répondu Jabba 2017-11-13 12:43:22

pour exhaustivité:

>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print "division by zero!"
...     else:
...         print "result is", result
...     finally:
...         print "executing finally clause"

...du tutoriel python .

notez aussi que vous pouvez capturer l'exception comme ceci:

>>> try:
...     this_fails()
... except ZeroDivisionError as detail:
...     print 'Handling run-time error:', detail
54
répondu cbare 2012-12-13 22:16:54

comment bien ignorer les Exceptions?

Il y a plusieurs façons de le faire.

Cependant, le choix de l'exemple a une solution simple qui ne couvre pas le cas général.

spécifique à l'exemple:

au lieu de

try:
    shutil.rmtree(path)
except:
    pass

Faites ceci:

shutil.rmtree(path, ignore_errors=True)

c'est un argument spécifique shutil.rmtree . Vous pouvez voir l'aide sur en faisant ce qui suit, et vous verrez qu'il peut permettre également de la fonctionnalité sur les erreurs.

>>> import shutil
>>> help(shutil.rmtree)

Puisque ceci ne couvre que le cas étroit de l'exemple, je vais en outre montrer comment gérer cela si ces arguments de mot clé n'existaient pas.

approche Générale

puisque ce qui précède ne couvre que le cas étroit de l'exemple, je vais en outre montrer comment gérer ce si ces mots-clés n'existaient pas.

nouveau en Python 3.4:

, Vous pouvez importer le suppress gestionnaire de contexte:

from contextlib import suppress

mais supprimer seulement l'exception la plus spécifique:

with suppress(FileNotFoundError):
    shutil.rmtree(path)

vous ignorerez silencieusement un FileNotFoundError :

>>> with suppress(FileNotFoundError):
...     shutil.rmtree('bajkjbkdlsjfljsf')
... 
>>> 

De la docs :

comme pour toute autre mécanisme qui supprime complètement les exceptions, ce gestionnaire de contexte doit être utilisé uniquement à couvrir les erreurs spécifiques où la poursuite silencieuse de l'exécution du programme est connue pour être le bonne chose à faire.

notez que suppress et FileNotFoundError ne sont disponibles qu'en Python 3.

si vous voulez que votre code fonctionne aussi en Python 2, consultez la section suivante:

Python 2& 3:

quand vous voulez juste faire un essai / sauf sans manipuler l'exception, comment voulez-vous faire en Python?

Est la suite de la bonne façon de le faire?

try :
    shutil.rmtree ( path )
except :
    pass

pour le code compatible Python 2, pass est la bonne façon d'avoir une déclaration qui est non-op. Mais quand vous faites un nu except: , c'est la même chose que faire except BaseException: qui inclut GeneratorExit , KeyboardInterrupt , et SystemExit , et, en général, vous ne voulez pas attraper ces choses.

En fait, vous devriez être aussi précis dans la désignation de l'exception que vous le pouvez.

Voici une partie de l'Python (2) l'exception " hiérarchie , et comme vous pouvez le voir, si vous attrapez plus d'Exceptions générales, vous pouvez masquer des problèmes que vous n'attendiez pas:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
... and so on

vous voulez probablement attraper un OSError ici, et peut-être l'exception vous ne se soucient pas si il n'y a pas de répertoire.

Nous sommes que numéro d'erreur spécifique de la errno la bibliothèque, et sur-relancer si nous n'avons pas que:

import errno

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno == errno.ENOENT: # no such file or directory
        pass
    else: # we had an OSError we didn't expect, so reraise it
        raise 

Note, une simple augmentation soulève l'exception originale, ce qui est probablement ce que vous voulez dans ce cas. Écrit plus concise, car nous n'avons pas vraiment besoin de explicitement pass avec le code dans le traitement d'exception:

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno != errno.ENOENT: # no such file or directory
        raise 
40
répondu Aaron Hall 2017-04-19 14:38:26

@quand vous voulez juste faire un essai sans Gérer l'exception, Comment faites-vous en Python?

cela vous aidera à imprimer ce qu'est l'exception:( i.e. essayez catch sans Gérer l'exception et imprimez l'exception.)

import sys
....
try:
    doSomething()
except:
    print "Unexpected error:", sys.exc_info()[0]

...

reg, Tilokchan

12
répondu Irengbam Tilokchan Singh 2011-10-12 05:36:30
try:
      doSomething()
except Exception: 
    pass
else:
      stuffDoneIf()
      TryClauseSucceeds()

FYI la clause else peut aller après toutes les exceptions et ne sera lancée que si le code dans le try ne cause pas d'exception.

8
répondu MrChrisRodriguez 2009-11-19 22:35:58

en Python, nous traitons des exceptions similaires à d'autres langues, mais la différence est une différence de syntaxe, par exemple,

try:
    #Your code in which exception can occur
except <here we can put in a particular exception name>:
    # We can call that exception here also, like ZeroDivisionError()
    # now your code
# We can put in a finally block also
finally:
    # Your code...
3
répondu Deepak Kumar 'SORTED' 2018-07-31 01:17:00

Simplement lever l'exception, comme cela:

try:
     raise NameError('Joan')
 except NameError:
     print 'An exception just raised again by Joan!'
     raise

aussi simple que ça. :)

pour plus de détails, veuillez lire la documentation: https://docs.python.org/3.6/tutorial/errors.html

-1
répondu MHBN 2018-06-03 20:21:21

gestion d'une exception en Python: si vous avez un code suspect qui peut soulever une exception, vous pouvez défendre votre programme en plaçant le code suspect dans un bloc try:.

try:
    # Your statements .............
except ExceptionI:
    # Your statements.............
except ExceptionII:
    # Your statements..............
else:
   # Your statements
-1
répondu pavuluri santhi 2018-07-31 01:18:33