2009-12-26 4 views

Antwort

2

-Stick versucht excepts überall kann Ihre Anwendung zum Absturz bringen (I/O, Netzwerk usw.). Wenn eine Ausnahme aufgerufen wird, rufen Sie eine Funktion auf, die das alte Fenster beendet, ein neues tkinter-Benachrichtigungsfenster oder eine custom one mit Ihrer Fehlermeldung erzeugt.

Machen Sie ein root.after zu dem neuen Fenster und senden Sie Ihren Fehlerbericht (urllib).

Setzen Sie eine Neustart-Taste, wenn Sie möchten.

Es gibt kein Framework für Absturzberichte - da tkinter nicht diese Art von GUI ist. Es ist ein Wrapper für einfache Befehlszeilen-Apps.

Go pyqt/gtk oder wxpython, wenn Sie die Funktionen in der obigen Screenshot sehen möchten. Aber ich bin mir ziemlich sicher, dass du, wo immer du auch hingehst, deinen eigenen Reporter schreiben musst.

+5

Ich stimme der Aussage nicht zu, dass tkinter "ziemlich ein Wrapper für einfache Befehlszeilen-Anwendungen" ist. Tkinter ist eine vollwertige GUI-Bibliothek, die für alle möglichen Zwecke geeignet ist. Und tatsächlich kann Tkinter auch verwendet werden, um alle Funktionen im Screenshot zu implementieren. –

+0

Ich stimme nicht zu, aber wenn man eine vollwertige, wartbare GUI (mit Crash-Reporting und Threads) erstellen würde, würde man mit dem geringsten Aufwand eines der anderen Toolkits verwenden, die ich oben aufgelistet habe. Der Grund dafür ist, dass Tkinter dieses Bedürfnis nicht ausreichend erfüllt. – torger

7

Statt Ihren Code mit try..except überall zu verschmutzen, sollten Sie nur Ihre eigenen außer Hook implementieren, indem Sie sys.excepthook setzen. Hier ein Beispiel:

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 

Anruf install_exception(), wenn die Anwendung gestartet wird.

ErrorReportDialog ist ein Qt-Dialog, den ich gemacht habe. traceback.format_exception() formatiert das Argument, das an den Exception-Hook übergeben wird, genauso wie es in Pythons Interpreter gemacht wird.

EDIT: Ich habe vergessen, ein wenig Gotcha damit zu erwähnen. Es funktioniert nicht mit Threads (naja, zumindest habe ich das letzte Mal nicht überprüft). Für Code, der in einem anderen Thread ausgeführt wird, müssen Sie ihn in einen try..except Block umbrechen.