提问人:Abgan 提问时间:3/6/2009 最后编辑:Abgan 更新时间:3/29/2010 访问量:1621
防止 wxPython 显示“未处理的异常”对话框
Prevent wxPython from showing 'Unhandled exception' dialog
问:
我有用 Python 和 wxPython 编写的复杂 GUI 应用程序。
我希望它通过 Windows Vista 认证,因此它必须以导致 Windows 错误报告对话框(询问“是否要向 Microsoft 发送报告?”)的方式崩溃。这与“Certified for Windows Vista Test Cases”文档中的第 32 号测试用例相关。
不幸的是,当我使用工具使我的应用程序崩溃时,wxPython显示如下消息:ThreadHijacker
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显示此消息?我有自定义,但似乎这个对话框显示在我的 except 钩子可以干扰之前。sys.excepthook
编辑:
wxWidgets 文档说 wxAppConsole::OnExceptionInMainLoop 被调用,在 MSW 下,它显示一些花哨的对话框,允许用户在不同的选项之间进行选择。然而,wxPython 似乎不允许重载该函数......有谁知道如何在wxPython中更改wxAppConsole::OnExceptionInMainLoop的默认行为?
我更喜欢 Python 级别的解决方案,而不是那些进入 C/C++ 的解决方案
编辑2:
总而言之,我在 wxPython 邮件列表上询问,Robin Dunn 回答说,他将研究在 wxPython 的下一个版本中使 wxAppConsole::OnExceptionInMainLoop 可被覆盖。由于我等不及了,我不得不编译我自己的wxPython版本,其中不包含该函数。事实证明,wxAppConsole::OnExceptionInMainLoop 函数的存在可以通过正确设置编译标志来启用/禁用。
答:
尝试 http://wiki.python.org/moin/CrashingPython
如果我没记错的话,这是 wxWidgets 中顶层 (wxApp) 的 catch(...)。您可以使用向量异常处理程序或 _set_se_translator() 来首次尝试结构化异常,然后从那里退出到 WER,即 ReportFault()。
评论
你有可能处理所有事情吗?我想,你必须在绑定到小部件的每个方法周围放置一个 try:except: 块。你可以写一个装饰器:
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()
然后装饰任何可以由主循环调用的函数(因为我认为这是 wxPython 自己捕获的地方)。
评论
最终编译了我自己的 wxWidgets 和 wxPython,只更改了一个编译标志:wxUSE_EXCEPTIONS 应该设置为 0。
Robin Dunn 写道,他将尝试修补 wxPython,因此可以在不重新编译整个库的情况下修改此行为。
评论