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.

Staale
la source

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:
nosklo
la source
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.


la source
1

Est-ce que ça marche? :

except BaseException, e:
Swaroop CH
la source
10
Vous ne devriez pas attraper BaseException- cela inclut SystemExitet KeyboardInterrupt, des choses que vous ne voulez généralement pas attraper.
nosklo