我有用Python和wxPython编写的复杂GUI应用程序。
我希望它能够通过Windows Vista认证,因此它必须以导致Windows错误报告对话框的方式崩溃(询问“您要向Microsoft发送报告吗?”的对话框) 出现。这与“ Windows Vista测试用例认证”文档中的测试案例32相关。
不幸的是,当我使用ThreadHijacker
工具使我的应用程序崩溃时,wxPython会显示如下信息:
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
如何阻止wxPython显示此消息?我有自定义sys.excepthook
,但似乎这个对话框显示在我的除了钩子可能会干扰之前。
编辑:
wxWidgets docs表示调用了 wxAppConsole :: OnExceptionInMainLoop ,在MSW下它显示了一些奇特的对话框,允许用户在不同的选项之间进行选择。但是,似乎wxPython不允许重载该函数...有谁知道如何在wxPython中更改 wxAppConsole :: OnExceptionInMainLoop 的默认行为?
我更喜欢Python级别的解决方案,而不是那些进入C / C ++的解决方案
EDIT2:
总而言之,我在wxPython邮件列表中问过,并且Robin Dunn回答说他会考虑在wxPython的下一个版本中覆盖 wxAppConsole :: OnExceptionInMainLoop 。因为我等不及了,所以我必须编译自己的wxPython版本,它不包含该函数。事实证明,通过正确设置编译标志,可以启用/禁用 wxAppConsole :: OnExceptionInMainLoop 功能。
答案 0 :(得分:2)
最后编译我自己的wxWidgets和wxPython,只改变了一个编译标志: wxUSE_EXCEPTIONS 应该设置为0.
Robin Dunn写道他将尝试修补wxPython,因此可以在不重新编译整个库的情况下修改此行为。
答案 1 :(得分:1)
如果我没记错的话,这是wxWidgets中顶级(wxApp)的catch(...)。您可以使用向量异常处理程序或_set_se_translator()来获取结构化异常的第一个镜头,然后从那里退出到WER,即ReportFault()。
答案 2 :(得分:1)
你有可能只处理一切吗?我想,你必须尝试:除了:阻止绑定到窗口小部件的每个方法。你可以写一个装饰者:
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()
然后装饰可以被mainloop调用的任何函数(因为我认为这是wxPython自己捕获的地方)。
答案 3 :(得分:0)