web-dev-qa-db-fra.com

Capture générique pour python

J'ai un comportement extrêmement bizarre qui semble entraîner des exceptions silencieuses. Comment puis-je écrire une capture d'essai générale où je peux déboguer toutes les exceptions. Quelque chose dans le sens de:

try:
    # something that fails
except e:
    print e

Un peu plus sur le problème à résoudre en détail:

J'ai une application Django qui, sur ma maquette (Ubuntu Linux 8.10) fonctionne bien à la fois via runserver et mod-python. Sur le serveur de déploiement (Ubunut Linux 8.10), elle fonctionne bien via runserver, mais échoue via Apache dans 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 du cornichon pour formater les clés. Il échoue lorsque j'appelle cornichon sur une seule valeur. Cependant, il échoue uniquement lorsque j'utilise cPickle, et l'utilisation de pickle sur les mêmes valeurs en dehors de la fonction de rappel fonctionne également.

Je veux juste savoir pourquoi il échoue avec cPickle.

71
Staale

Les exceptions sont déjà imprimées par défaut avant la fin du programme. Si vous voulez 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 mot clé as est pour python> 2.6. L'ancienne méthode était:

except Exception, e:
137
nosklo

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

2
unbeknown

Est-ce que ça marche? :

except BaseException, e:
1
Swaroop C H