2

J'utilise une interface utilisateur PyQt4. J'ai redirigé stderr vers un fichier journal pour faciliter le débogage et le dépannage, mais maintenant je dois afficher des messages d'erreur à l'utilisateur lorsqu'une erreur survient. Mon problème est que j'ai besoin d'attraper une exception quand cela se produit et de laisser l'utilisateur savoir que cela s'est produit, tout en laissant la trace remonter à stderr (c'est-à-dire le fichier journal).Comment afficher les erreurs à l'utilisateur tout en l'enregistrant?

Si je fais quelque chose comme ceci:

def updateResults(self): 
    try: 
     #code that updates the results 
    except: 
     #display error message box 

Cela va attraper l'exception et non dans le journal se propager d'erreur.

Existe-t-il un moyen d'afficher le message à l'utilisateur et de continuer à propager l'erreur?

Est-ce que cela fonctionnerait?

except, e: 
    #display error message box 
    raise e 

Y a-t-il une meilleure façon d'atteindre mon objectif?

Répondre

6

Je pense que vous pensez à cela de la mauvaise façon. Vous ne devriez pas relancer l'erreur simplement pour l'enregistrer plus bas sur la ligne. La façon canonique de faire cela en Python est d'utiliser le module de journalisation. Adapté de la documentation:

import logging 
LOG_FILENAME = '/tmp/logging_example.out' 
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG,) 

... 

try: 
    # code 
except: 
    logging.debug('Something bad happened', exc_info=True) 
    # display message box 
    # raise (if necessary) 

Cela donne un système d'enregistrement beaucoup plus souple que de compter sur les erreurs produites sur sys.stdout. Vous ne devrez peut-être pas sur-relancer l'exception si vous pouvez récupérer l'exception d'une manière ou d'une autre.

+0

Je vais certainement utiliser cette méthode pour les projets futurs. En ce moment, py2exe fait la redirection de 'stderr', donc à moins que je refactorise mon code pour essayer-excepté les blocs autour de * chaque * fonction je finirai avec deux fichiers journaux (exceptions capturées et non-interceptées). – tgray

+0

Fondamentalement, l'avantage de mettre en œuvre cette méthode ne vaut pas le temps de refactoring pour * ce * projet. – tgray

+0

Gardez à l'esprit (tgray) que vous voulez séparer vos exceptions interceptées/non interceptées. Le schéma de journalisation décrit par Ant est le meilleur, car vous pouvez vous connecter au fichier ou vous connecter à la base de données, ou même vous connecter à la base de données AND et vous n'avez pas besoin de changer votre code à chaque endroit. – DevinB

3

Exactement, mais vous pouvez juste

raise 

qui rangerait l'exception actuellement traitées.

1

Quelques informations supplémentaires:

(Avec PyQt4) vous devrez également rebind sys.excepthook à votre propre fonction pour attraper tous les uncaught exceptions. Sinon PyQt va simplement les imprimer à la console, ce qui peut ne pas être ce dont vous avez besoin ...

import sys 

def excepthook(exc_type, exc_val, tracebackobj): 
    # do something useful with the uncaught exception 
    ... 

def main(): 
    # rebind excepthook 
    sys.excepthook = excepthook 
    ... 
+0

En fait, py2exe gère automatiquement la création d'un fichier "programme.exe.log". – tgray

+0

Mais bon à savoir si j'écris jamais une application qui n'est pas fournie avec py2exe. – tgray

Questions connexes