防止 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 中的未处理异常导致主进程崩溃?

wxpython 对话框

来自 MFC 对话框中使用的托管 C# 用户控件的未处理异常

CustomDraw 中的 SetWindowLong 导致未处理的异常

如何运行wxpython

来自 WPF 应用程序的异常报告