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 em> viene chiamato e sotto MSW visualizza alcune fantastiche finestre di dialogo che consentono all'utente di scegliere tra le diverse opzioni. Sembra tuttavia che wxPython non consenta di sovraccaricare tale funzione ... Qualcuno sa come modificare il comportamento predefinito di wxAppConsole :: OnExceptionInMainLoop in wxPython?
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.

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top