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
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:
- instruction try - http://docs.python.org/reference/compound_stmts.html#try
- exceptions - http://docs.python.org/library/exceptions
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:
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
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
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
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
@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
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.
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...
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
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