Empêcher wxPython d'afficher la boîte de dialogue 'Exception non gérée'
-
03-07-2019 - |
Question
J'ai une application graphique complexe écrite en Python et wxPython.
Je souhaite qu'il soit certifié pour Windows Vista. Il doit donc se bloquer, ce qui entraîne l'affichage de la boîte de dialogue Rapport d'erreurs Windows (celle qui demande " Souhaitez-vous envoyer le rapport à Microsoft? ") à paraître. Ceci est pertinent pour le cas de test n ° 32 de " Certifié pour les cas de test Windows Vista ??em>". document.
Malheureusement, lorsque je bloque mon application avec l'outil ThreadHijacker
wxPython, un message du type:
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
Comment puis-je empêcher wxPython d’afficher ce message? J'ai personnalisé sys.excepthook
, mais il semble que cette boîte de dialogue soit affichée avant que mon crochet except puisse interférer.
EDIT:
EDIT2:
Dans l’ensemble, j’ai posé la question à la liste de diffusion wxPython et Robin Dunn a répondu qu’il envisagerait de rendre wxAppConsole :: OnExceptionInMainLoop remplaçable dans les prochaines versions de wxPython. Comme je ne pouvais pas attendre, je devais compiler ma propre version de wxPython qui n'inclut pas cette fonction. Il est apparu que la présence de la fonction wxAppConsole :: OnExceptionInMainLoop peut être activée / désactivée en définissant correctement les indicateurs de compilation.
La solution
Tout a fini par compiler mes propres wxWidgets et wxPython, avec un seul indicateur de compilation modifié: wxUSE_EXCEPTIONS doit être défini sur 0.
Robin Dunn a écrit qu’il essaierait de mettre à jour wxPython, ce comportement pourrait donc être modifié sans recompiler l’ensemble de la bibliothèque.
Autres conseils
Si je me souviens bien, c’est un piège (...) au plus haut niveau (wxApp) dans wxWidgets. Vous pouvez utiliser un gestionnaire d’exception vectoriel ou _set_se_translator () pour obtenir un premier aperçu de l’exception structurée, puis quitter WER, c’est-à-dire ReportFault ().
Est-il possible pour vous de tout gérer? J'imagine que vous devriez essayer: sauf: bloquer toutes les méthodes liées à un widget. Vous pouvez écrire un décorateur:
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()
Décorez ensuite toute fonction qui pourrait être appelée par la boucle principale (puisque je suppose que c’est là que wxPython fait sa propre capture).