web-dev-qa-db-fra.com

À propos de la capture de toute exception

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

605
user469652

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
500
Tim Pietzcker

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.

712
Duncan

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
94
vwvolodya

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!

50
Joshua Burns

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.

49
gitaarik

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
18
Danilo

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:

  • Numéro de ligne pour votre code
  • Nom de fichier
  • L'erreur réelle de manière plus verbeuse

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()
11
grepit
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.

4
Yuval Adam