Capture générique pour python


86

J'ai un comportement extrêmement étrange qui semble entraîner des exceptions silencieuses. Comment puis-je écrire un essai général où je peux déboguer toutes les exceptions. Quelque chose du genre:

try:
    # something that fails
except e:
    print e

Un peu plus sur le problème en question en détail:

J'ai une application Django qui sur mon ordinateur (Ubuntu Linux 8.10) fonctionne bien à la fois via runserver et mod-python. Sur le serveur de déploiement (Ubuntu Linux 8.10), cela fonctionne correctement via runserver, mais échoue via apache en mod-python.

J'ai réduit la cause à une partie de l'application qui utilise Berkeley DB (bsddb.db) et des clés secondaires. La méthode de rappel pour les clés secondaires utilise pickle pour formater les clés. Cela échoue lorsque j'appelle pickle sur une seule valeur. Cependant, cela échoue uniquement lorsque j'utilise cPickle et que l'utilisation de pickle sur les mêmes valeurs en dehors de la fonction de rappel fonctionne également.

Je veux juste savoir pourquoi cela échoue avec cPickle.

Réponses:


164

Les exceptions sont déjà imprimées par défaut avant la fin du programme. Si vous souhaitez envoyer l'erreur ailleurs (pas l'imprimer), vous pouvez le faire:

try:
    something()
except Exception as e:
    send_somewhere(traceback.format_exception(*sys.exc_info()))
    raise # reraises the exception

notez que ce format utilisant le asmot-clé est pour python> 2.6. L'ancienne méthode était:

except Exception, e:

5
ne connaissait pas le changement «Exception as e». "Exception, e" m'a toujours mis sur écoute, c'est agréable de voir qu'il a été nettoyé.
monkut le

3
Le mot-clé 'as' est pour python> = 2.6
pixelbeat

Une solution si simple. Pourtant, je google tous les deux mois, et je clique sur le lien supérieur et je termine ici.
niCk cAMel

3

Le module de traceback est assez utile pour formater les traces. Vous pouvez ensuite l'écrire dans un fichier journal.


1

Est-ce que ça marche? :

except BaseException, e:

10
Vous ne devriez pas attraper BaseException- cela inclut SystemExitet KeyboardInterrupt, des choses que vous ne voulez généralement pas attraper.
nosklo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.