2009-03-06 12 views
1

J'ai une application graphique complexe écrite en Python et wxPython. Je veux qu'il soit certifié pour Windows Vista, il doit donc se bloquer de manière à provoquer la boîte de dialogue Rapport d'erreurs Windows (Celui qui demande "Voulez-vous envoyer un rapport à Microsoft?") apparaît. Ceci est pertinent pour le cas de test n ° 32 du document "Certified for Windows Vista Test Cases".Empêche wxPython d'afficher une boîte de dialogue 'Exception non gérée'

Malheureusement, quand je crash mon application avec ThreadHijacker outil wxPython montre un message comme:

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 de montrer ce message? J'ai personnalisé sys.excepthook, mais il semble que cette boîte de dialogue est affichée avant que mon crochet, sauf peut interférer.

EDIT:

wxWidgets docs dit que wxAppConsole :: OnExceptionInMainLoop est appelé et sous MSW, il affiche une boîte de dialogue de fantaisie qui permet à l'utilisateur de choisir entre les différentes options. Il semble cependant que wxPython ne permet pas de surcharger cette fonction ... Est-ce que quelqu'un sait comment changer le comportement par défaut de wxAppConsole :: OnExceptionInMainLoop dans wxPython?
Je préfère des solutions au niveau Python sur ceux qui vont en C/C++

EDIT2:

Dans l'ensemble, j'ai demandé à la liste de diffusion wxPython, et Robin Dunn a répondu qu'il regardera en rendant wxAppConsole :: OnExceptionInMainLoop remplaçable dans les prochaines versions de wxPython. Comme je ne pouvais pas attendre, j'ai dû compiler ma propre version de wxPython qui n'inclut pas cette fonction. Il s'est avéré que la présence de la fonction wxAppConsole :: OnExceptionInMainLoop peut être activée/désactivée par le réglage correct des drapeaux de compilation.

+0

Si vous n'obtenez pas de réponse ici, votre meilleur pari est probablement d'essayer la liste de diffusion de wxpython, puisque de nombreux experts (y compris Robin Dunn) s'y tiennent. –

Répondre

2

Tout a fini de compiler mon propre wxWidgets et wxPython, avec un seul drapeau de compilation changé: wxUSE_EXCEPTIONS doit être réglé sur 0.

Robin Dunn a écrit qu'il va essayer de patcher wxPython, donc ce comportement pourrait être modifié sans recompilation de toute la bibliothèque.

1

Si je me souviens bien, cela est une prise (...) au plus haut niveau (wxApp) à wxWidgets. Vous pouvez utiliser un gestionnaire d'exceptions vectoriel ou _set_se_translator() pour obtenir un premier tir à l'exception structurée et quitter à WER, c'est-à-dire ReportFault() à partir de là.

+0

Vous avez raison sur wxWidgets et ReportFault(), cela m'a indiqué dans la bonne direction. Mais dans wxPython je ne peux pas changer le comportement par défaut (il semble qu'il ne soit pas exporté vers Python). – Abgan

+0

Pourriez-vous mettre à jour votre question, semble que vous voulez une solution 100% python. Les deux solutions que j'ai suggérées supposent un ccode natif, soit au CRT sous-jacent, soit au niveau Win32. – MSalters

1

Est-il possible pour vous de tout gérer? Il faudrait, je suppose, essayer: sauf: bloquer autour de chaque méthode liée à 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écore ensuite toute fonction qui pourrait être appelée par le mainloop (puisque je suppose que c'est là wxPython fait son propre capture).

+0

Mon code a plus de 80k lignes de code, donc cela prendrait pas mal de temps ... J'ai peur que l'erreur ne se lève dans le code C++, et qu'elle soit entièrement gérée au niveau C++. Ce que je veux vraiment faire est de gérer cette erreur * AVANT * wxWidgets le fera. – Abgan

+0

Quoi qu'il en soit - Je vais vérifier votre méthode, car elle ne m'a pas traversé l'esprit. Merci et upvote pour vous. :-) – Abgan

Questions connexes