2009-12-26 8 views

Répondre

2

bâton essayer votre application partout excepte peut tomber en panne (E/S, réseau, etc.). Chaque fois qu'une exception est appelée, appelez une fonction qui va tuer l'ancienne fenêtre, générer une nouvelle fenêtre de notification tkinter, ou un custom one avec votre message d'erreur. Faites un root.after à la nouvelle fenêtre et envoyez votre rapport d'erreur (urllib).

Mettez un bouton de redémarrage si vous le souhaitez.

Il n'y a pas de structure de génération de rapports de collision - car tkinter n'est pas ce type de GUI. C'est à peu près un emballage pour les applications de ligne de commande simples.

Allez pyqt/gtk ou wxpython si vous voulez les fonctionnalités vues dans la capture d'écran ci-dessus. Mais je suis à peu près sûr que là où tu iras, tu devras écrire ton propre reporter.

+5

Je ne suis pas d'accord avec l'affirmation que tkinter est «à peu près un emballage pour les applications de ligne de commande simples». Tkinter est une bibliothèque graphique à part entière adaptée à toutes sortes de besoins. Et en fait, Tkinter peut également être utilisé pour implémenter toutes les fonctionnalités de la capture d'écran. –

+0

Je ne suis pas en désaccord, mais si l'on créait une interface graphique complète et maintenable (avec des rapports de plantage et des threads), avec le moins d'effort possible, on utiliserait l'un des autres toolkits listés ci-dessus. La raison pour laquelle ils existent est parce que Tkinter ne répond pas adéquatement à ce besoin. – torger

7

Plutôt que de polluer votre code avec try..except partout, vous devez simplement implémenter le vôtre sauf le hook en définissant sys.excepthook. Voici un exemple:

import sys 
import traceback 

def install_excepthook(): 
    def my_excepthook(exctype, value, tb): 
     s = ''.join(traceback.format_exception(exctype, value, tb)) 
     dialog = ErrorReportDialog(None, s) 
     dialog.exec_() 

    sys.excepthook = my_excepthook 

Appel install_exception() lorsque votre application démarre.

ErrorReportDialog est une boîte de dialogue Qt que j'ai faite. traceback.format_exception() formatera l'argument passé à l'exception hook de la même manière que dans l'interpréteur Python.

EDIT: J'ai oublié de mentionner un peu ça avec ça. Cela ne fonctionne pas avec les threads (enfin, au moins, je n'ai pas vérifié la dernière fois). Pour le code s'exécutant dans un autre thread, vous devrez l'envelopper dans un bloc try..except.