Impedisci a wxPython di mostrare la finestra di dialogo "Eccezione non gestita"
-
03-07-2019 - |
Domanda
Ho un'applicazione GUI complessa scritta in Python e wxPython.
Voglio che sia certificato per Windows Vista, quindi deve bloccarsi in un modo che provoca la finestra di dialogo Segnalazione errori di Windows (Quella che richiede " Vuoi inviare un rapporto a Microsoft? ") per apparire. Ciò è rilevante per il caso di test n. 32 da " Certificati per casi di test di Windows Vista " documento.
Sfortunatamente quando arresto la mia app con lo strumento ThreadHijacker
wxPython mostra un messaggio come:
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
Come posso impedire a wxPython di mostrare questo messaggio? Ho un sys.excepthook
personalizzato, ma sembra che questa finestra di dialogo sia mostrata prima che il mio hook tranne possa interferire.
MODIFICA:
wxWidgets docs dice che
Preferisco soluzioni a livello Python rispetto a quelle che vanno in C / C ++
EDIT2:
Tutto sommato, ho chiesto alla mailing list di wxPython e Robin Dunn ha risposto che cercherà di rendere wxAppConsole :: OnExceptionInMainLoop sostituibile nelle prossime versioni di wxPython. Dato che non potevo aspettare, ho dovuto compilare la mia versione di wxPython che non include quella funzione. Si è scoperto che la presenza della funzione wxAppConsole :: OnExceptionInMainLoop può essere abilitata / disabilitata impostando correttamente i flag di compilazione.
Soluzione
Tutto è finito con la compilazione dei miei wxWidgets e wxPython, con un solo flag di compilazione modificato: wxUSE_EXCEPTIONS dovrebbe essere impostato su 0.
Robin Dunn ha scritto che proverà a correggere wxPython, quindi questo comportamento potrebbe essere modificato senza ricompilare l'intera libreria.
Altri suggerimenti
Se ricordo bene, questo è un problema (...) al livello più alto (wxApp) in wxWidgets. Puoi utilizzare un gestore delle eccezioni vettoriale o _set_se_translator () per ottenere un primo colpo all'eccezione strutturata e uscire da WER, ad esempio ReportFault () da lì.
È possibile per te gestire tutto? Dovresti, suppongo, provare: tranne: bloccare attorno a ogni metodo associato a un widget. Potresti scrivere un decoratore:
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()
Quindi decora qualsiasi funzione che potrebbe essere chiamata dal mainloop (dal momento che presumo che sia lì che wxPython fa la sua cattura).