Frage

ich komplexe GUI-Anwendung habe geschrieben in Python und wxPython.

Ich will es für Windows Vista zertifiziert werden, so hat es in einer Art und Weise zum Absturz bringen, die Windows-Fehlerberichterstattung Dialog führt (derjenige, der fragt: „ Haben Sie Bericht an Microsoft senden möchten? “ ) erscheinen. Dies ist relevant für Testfall keine 32 von " Certified for Windows Vista Testfälle " Dokument.

Leider, wenn ich meine app mit ThreadHijacker Werkzeug Absturz WxPython zeigt Meldung wie:

Unhandled exception
---------------------------
An unhandled exception occurred. Press "Abort" to terminate the program,
"Retry" to exit the program normally and "Ignore" to try to continue.
---------------------------
Abort   Retry   Ignore

Wie kann ich verhindern, dass WxPython diese Nachricht aus zeigt? Ich habe benutzerdefinierte sys.excepthook, aber es scheint, dass dieser Dialog angezeigt wird, bevor mein außer Haken stören kann.

EDIT:

docs sagt, dass wxAppConsole :: OnExceptionInMainLoop genannt wird und unter MSW zeigt es einigen ausgefallenen Dialog, den Benutzer zwischen den verschiedenen Optionen wählen kann. Es scheint jedoch, dass WxPython nicht erlaubt, diese Funktion zu überlasten ... Wer weiß, wie das Standardverhalten von wxAppConsole :: OnExceptionInMainLoop in WxPython ändern?
Ich ziehe es Lösungen, die über die auf Python-Ebene sind, die in C / C ++ gehen

EDIT2:

Alles in allem, fragte ich bei WxPython Mailing-Liste, und Robin Dunn antwortete, dass er in der Herstellung aussehen wird wxAppConsole :: OnExceptionInMainLoop overridable in nächsten Versionen von wxPython. Da konnte ich nicht warten, hatte ich meine eigene Version von wxPython zu kompilieren, die nicht diese Funktion nicht enthalten. Es stellte sich heraus, dass die Anwesenheit von wxAppConsole :: OnExceptionInMainLoop Funktion aktiviert / deaktiviert durch die richtige Einstellung der Kompilation Flags werden kann.

War es hilfreich?

Lösung

Alles endete mit meinem eigenen wxWidgets und WxPython kompilieren, mit nur einer Kompilation Flagge geändert:. wxUSE_EXCEPTIONS sollte auf 0 gesetzt werden

Robin Dunn schrieb, dass er versucht, wxPython zu flicken, so könnte dieses Verhalten ohne Neukompilierung der gesamten Bibliothek geändert werden.

Andere Tipps

Wenn ich mich richtig erinnere, ist dies ein catch (...) auf höchster Ebene (wxApp) in wxWidgets. Sie können entweder einen vektorisiert Exception Handler oder _set_se_translator () verwenden, um einen ersten Schuss auf der Structured Exception zu bekommen, und Ausgang zum WER, das heißt ReportFault () von dort.

Ist es möglich, dass Sie nur noch alles im Griff? Sie müßten, glaube ich, einen Versuch setzen: mit Ausnahme von: Block um jede Methode, um ein Widget gebunden. Sie könnten einen Dekorateur schreiben:

def catch_exception(f):
    def safe(*args, **kw):
        try:
            f(*args, **kw)
        except Exception, e:
            handle_exception(e)
    return safe

def handle_exception(e):
    # do Vista stuff
    sys.exit()

Dann jede Funktion dekorieren, die von der mainloop genannt werden könnte (da ich nehme an das ist, wo WxPython seine eigene tut Fang).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top