防止 wxPython 显示“未处理的异常”对话框
Posted
技术标签:
【中文标题】防止 wxPython 显示“未处理的异常”对话框【英文标题】:Prevent wxPython from showing 'Unhandled exception' dialog 【发布时间】:2010-10-11 17:33:16 【问题描述】:我有用 Python 和 wxPython 编写的复杂 GUI 应用程序。
我希望它通过 Windows Vista 认证,因此它必须以一种导致 Windows 错误报告对话框的方式崩溃(询问“你想向 Microsoft 发送报告吗?” ) 出现。这与“Certified for Windows Vista Test Cases”文档中的第 32 号测试用例有关。
不幸的是,当我使用 ThreadHijacker
工具使我的应用程序崩溃时,wxPython 显示如下消息:
未处理的异常 -------------------------- 发生未处理的异常。按“中止”终止程序, “重试”正常退出程序,“忽略”尝试继续。 -------------------------- 中止重试忽略
如何防止 wxPython 显示此消息?我有自定义sys.excepthook
,但似乎这个对话框在我的 except 钩子可以干扰之前显示。
编辑:
wxWidgets docs 表示调用了 wxAppConsole::OnExceptionInMainLoop 并在 MSW 下显示了一些精美的对话框,允许用户在不同的选项之间进行选择。然而,似乎 wxPython 不允许重载该函数...有谁知道如何更改 wxPython 中 wxAppConsole::OnExceptionInMainLoop 的默认行为? 我更喜欢 Python 级别的解决方案,而不是 C/C++ 的解决方案
EDIT2:
总而言之,我在 wxPython 邮件列表中询问过,Robin Dunn 回答说他会考虑在 wxPython 的下一个版本中使 wxAppConsole::OnExceptionInMainLoop 可覆盖。由于迫不及待,我不得不编译我自己的 wxPython 版本,它不包含该函数。事实证明,wxAppConsole::OnExceptionInMainLoop 函数的存在可以通过正确设置编译标志来启用/禁用。
【问题讨论】:
如果您在这里没有得到答案,最好的办法可能是尝试 wxpython 邮件列表,因为很多专家(包括 Robin Dunn)都在那里闲逛。 【参考方案1】:最终编译了我自己的 wxWidgets 和 wxPython,只更改了一个编译标志:wxUSE_EXCEPTIONS 应设置为 0。
Robin Dunn 写道,他将尝试修补 wxPython,因此无需重新编译整个库即可修改此行为。
【讨论】:
【参考方案2】:你可以处理所有事情吗?我想,您必须在绑定到小部件的每个方法周围放置一个 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 自己捕获的地方)。
【讨论】:
我的代码有 >80k 行代码,所以这将花费相当多的时间......我担心 C++ 代码中会引发错误,并且在 C++ 级别完全处理。我真正想做的是处理 BEFORE wxWidgets 会这样做的错误。 无论如何 - 我会检查你的方法,因为我没有想到它。谢谢你并为你投票。 :-)【参考方案3】:如果我没记错的话,这是 wxWidgets 中顶层 (wxApp) 的 catch(...)。您可以使用向量异常处理程序或 _set_se_translator() 来获得结构化异常的第一枪,然后退出到 WER,即 ReportFault() 从那里。
【讨论】:
您对 wxWidgets 和 ReportFault() 的看法是正确的,这为我指明了正确的方向。但在 wxPython 中我无法更改默认行为(似乎它没有导出到 Python)。 可能想要更新您的问题,似乎您想要 100% python 解决方案。我建议的两种解决方案都假定使用原生 ccode,无论是在底层 CRT 还是在 Win32 级别。【参考方案4】:试试http://wiki.python.org/moin/CrashingPython
【讨论】:
以上是关于防止 wxPython 显示“未处理的异常”对话框的主要内容,如果未能解决你的问题,请参考以下文章
是否可以防止子 AppDomain 中的未处理异常导致主进程崩溃?
来自 MFC 对话框中使用的托管 C# 用户控件的未处理异常