2010-01-05 4 views
17

J'ai un programme dont une partie exécute une boucle. Pendant l'exécution de cette boucle, il y a des exceptions. Évidemment, je voudrais que mon programme s'exécute sans erreurs, mais pour des raisons de progrès, je voudrais que le programme s'exécute sur toute l'entrée et ne s'arrête pas quand une exception est levée. La façon la plus simple de le faire serait d'implémenter un bloc except.Gérer une exception arbitraire, imprimer un message d'exception par défaut

Cependant, quand je fais cela, except s toutes les exceptions et continue avec le programme et je ne vois jamais le message d'exception, dont j'ai besoin pour déboguer.

Existe-t-il un moyen de except toute exception arbitraire et être en mesure d'imprimer le message d'exception dans le bloc except?

Répondre

17
try: 
    #stuff 
except Exception as e: 
    print e 

Le module traceback fournit diverses fonctions pour extraire davantage d'informations à partir de l'objet d'exception (e, ci-dessus).

Source Errors and Exceptions

+3

Notez que la syntaxe 'Exception, e' est obsolète à partir de la version 2.6 et cesse de fonctionner à partir de la version 3.0. Si vous avez du code qui doit fonctionner à la fois avec 2.x et 3.x, utilisez 'Exception as e' à la place. (Cependant, si vous avez besoin de travailler avec 2.5 ou plus tôt, vous devez utiliser cette syntaxe.) – abarnert

4
while True: 
    try: 
     # Do your stuff 
    except Exception, e: 
     print "Something happened: %s" % e 
+1

En python 3, utilisez 'print (" Quelque chose est arrivé: {} ". Format (e))'. – amicitas

12

Pensez à utiliser le module de journalisation Python, c'est vous donnera beaucoup de fonctionnalités pour enregistrer les problèmes pour une inspection ultérieure. Ci-dessous un exemple simple d'utilisation du module de journalisation pour vous connecter des exceptions:

import logging 
LOG_FILE = '/tmp/exceptions.log' 
logging.basicConfig(filename=LOG_FILE,level=logging.ERROR) 

while True: 
try: 
    # Code that may throw exceptions 
except Exception, e: 
    logging.exception("An exception happened") 

En utilisant la fonction logging.exception dans un gestionnaire d'exceptions comme ici l'info d'exception est ajouté automatiquement au message de journalisation.

4

Je trouve que cela est beaucoup plus utile pour le débogage:

from traceback import print_exc 
try: 
    raise Exception("doh!") 
except: 
    print_exc() 
6

Alors que la réponse de James est presque toujours ce que vous voulez vraiment, ce n'est pas tout à fait ce que l'OP a demandé:

est-il un moyen d'exclure toute exception arbitraire et d'imprimer le message d'exception dans le bloc except?

Exception ne fait pas poignée toutes exceptions, seulement toutes les exceptions que vous voulez habituellement attraper. En particulier, dans les versions 2.5 et ultérieures:

Toutes les exceptions intégrées qui ne sont pas liées au système sont dérivées de cette classe. Toutes les exceptions définies par l'utilisateur doivent également être dérivées de cette classe.

Cela laisse quelques petites choses:

  • intégrés exceptions-sortie du système, comme un KeyboardInterrupt de l'utilisateur frapper ^C (2.5 et plus tard seulement)
  • exceptions définies par l'utilisateur don « t suivre que « devrait »

Très de temps en temps, vous voulez gérer les choses comme KeyboardInterrupt, dans ce cas, vous utilisez BaseException au lieu de Exception.(Voir Exception hierarchy pour une liste dont les exceptions sont et ne sont pas Exception sous-classes.) Donc:

try: 
    # stuff 
except BaseException as e: 
    print e 

Et (habituellement temporairement pendant le débogage) parfois vous voulez vraiment gérer absolument tout. Dans 2.7, cela inclut les exceptions définies comme des classes de style ancien; dans 2.5 et plus tôt, il inclut également des chaînes. La seule façon de gérer toutes ces possibilités est d'utiliser un nu except puis utilisez sys.exc_info (et, le cas échéant, tout ce que vous re raise ne voulais pas gérer):

try: 
    # stuff 
except: 
    type, value, traceback = sys.exc_info() 
    print value 

Comme une note de côté, je J'utilise la nouvelle syntaxe except (except Exception as e) ci-dessus. Cela fonctionne dans 2.6 et plus tard, y compris 3.x. La syntaxe de style ancien (except Exception, e) est obsolète dans 2.6 et cesse de fonctionner dans la version 3.0, mais si vous voulez travailler avec des versions 2.x plus anciennes, vous devez l'utiliser.

Questions connexes