Comment puis-je écrire un bloc try
/except
qui intercepte toutes les exceptions?
Vous pouvez mais vous ne devriez probablement pas:
try:
do_something()
except:
print "Caught it!"
Cependant, cela va aussi intercepter des exceptions comme KeyboardInterrupt
et vous ne le souhaitez généralement pas, n'est-ce pas? Sauf si vous relancez l'exception tout de suite - voir l'exemple suivant à partir de la documentation :
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
Mis à part une simple clause except:
((qui, comme d'autres l'ont déjà dit, vous ne devriez pas l'utiliser), vous pouvez simplement intercepter Exception
:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
Vous ne devriez normalement envisager de faire cela qu'au niveau le plus externe de votre code si, par exemple, vous souhaitez gérer des exceptions non détectées avant la fin.
L’avantage de except Exception
par rapport à except
est qu’il existe quelques exceptions qu’il ne détectera pas, notamment KeyboardInterrupt
et SystemExit
: si vous les capturez et les avalez, vous risquez d’avoir du mal à sortir de votre script.
Vous pouvez le faire pour gérer les exceptions générales
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
Exemple très simple, similaire à celui trouvé ici:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
Si vous essayez de récupérer TOUTES les exceptions, placez tout votre code dans l'instruction "try:" au lieu de "print". Effectuez une action susceptible de générer une exception. "'.
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
Dans l'exemple ci-dessus, vous verrez la sortie dans cet ordre:
1) Effectuer une action qui peut lever une exception.
2) Enfin, il est appelé directement après l'exécution de l'instruction try, qu'une exception soit levée ou non.
3) "Une exception a été levée!" ou "Tout est superbe!" en fonction de si une exception a été levée.
J'espère que cela t'aides!
Pour intercepter toutes les exceptions possibles, intercepte BaseException
. C'est au-dessus de la hiérarchie des exceptions:
Python 3: https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy
Python 2.7: https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
Mais comme d'autres personnes l'ont mentionné, vous ne devriez généralement pas faire cela, à moins d'avoir une très bonne raison.
Je viens de découvrir ce petit truc pour tester si les noms des exceptions dans Python 2.7. Parfois, j'ai manipulé des exceptions spécifiques dans le code, j'ai donc eu besoin d'un test pour voir si ce nom est dans une liste d'exceptions traitées.
try:
raise IndexError #as test error
except Exception as e:
excepName = type(e).__# returns the name of the exception
Il y a plusieurs façons de le faire, en particulier avec Python 3.0 et versions ultérieures.
approche 1
C'est une approche simple mais non recommandée car vous ne sauriez pas exactement quelle ligne de code lève l'exception:
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
approche 2
Cette approche est recommandée car elle fournit plus de détails sur chaque exception. Il comprend:
Le seul inconvénient est que le traçage doit être importé.
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
try:
whatever()
except:
# this will catch any exception or error
Il est à noter que ce n'est pas le bon codage Python. Cela attrapera aussi beaucoup d'erreurs que vous pourriez ne pas vouloir attraper.