Question A propos d'attraper TOUTE exception


Comment puis-je écrire un try/except bloc qui attrape toutes les exceptions?


443
2018-02-14 09:46


origine


Réponses:


Vous pouvez mais vous ne devriez probablement pas:

try:
    do_something()
except:
    print "Caught it!"

Cependant, cela entraînera également des exceptions comme KeyboardInterrupt et vous ne le voulez généralement pas, n'est-ce pas? Sauf si vous relancez l'exception immédiatement - voir l'exemple suivant des docs:

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

365
2018-02-14 09:49



En dehors d'un nu except: clause (qui, comme d’autres l’ont dit, vous ne devriez pas utiliser), vous pouvez simplement attraper Exception:

import traceback
import logging

try:
    whatever()
except Exception as e:
    logging.error(traceback.format_exc())
    # Logs the error appropriately. 

Normalement, vous ne devriez envisager de faire cela qu'au niveau le plus éloigné de votre code si, par exemple, vous vouliez gérer des exceptions non interceptées avant de terminer.

L'avantage de except Exception sur le nu except est qu'il y a quelques exceptions qu'il ne va pas attraper, le plus évidemment KeyboardInterrupt et SystemExit: si vous les avez attrapés et avalés, vous pourriez rendre difficile la sortie de votre script.


544
2018-02-14 12:26



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

81
2017-07-14 19:27



Exemple très simple, similaire à celui trouvé ici:

http://docs.python.org/tutorial/errors.html#defining-clean-up-actions

Si vous tentez d'attraper TOUTES les exceptions, mettez tout votre code dans l'instruction "try:", à la place de "print". Effectuez une action qui peut 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 verriez la sortie dans cet ordre:

1) Effectuer une action pouvant lancer une exception.

2) Enfin, on appelle directement après exécution de l'instruction try si une exception est levée ou non.

3) "Une exception a été lancée!" ou "Tout a l'air génial!" selon si une exception a été levée.

J'espère que cela t'aides!


37
2018-02-14 16:21



Pour attraper toutes les exceptions possibles, attraper BaseException. C'est en haut 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 le faire, à moins que vous n'ayez une très bonne raison.


34
2017-07-24 11:39



Je viens de découvrir cette petite astuce pour tester les noms des exceptions dans Python 2.7. Parfois, j'ai traité des exceptions spécifiques dans le code, alors j'avais besoin d'un test pour voir si ce nom figurait dans une liste d'exceptions traitées.

try:
    raise IndexError #as test error
except Exception as e:
    excepName = type(e).__name__ # returns the name of the exception

7
2017-11-28 11:16



try:
    whatever()
except:
    # this will catch any exception or error

Il est à noter que ce n'est pas le bon codage Python. Cela attirera également beaucoup d'erreurs que vous ne voudrez peut-être pas attraper.


3
2018-02-14 09:49