1

我有用 Python 和 wxPython 编写的复杂 GUI 应用程序。

我希望它通过 Windows Vista 认证,因此它必须以一种导致 Windows 错误报告对话框(询问“你想向 Microsoft 发送报告吗? ”)出现的方式崩溃。这与“ Certified for Windows Vista Test Cases ”文档中的第 32 号测试用例有关。

ThreadHijacker不幸的是,当我使用工具 wxPython使我的应用程序崩溃时,会显示如下消息:

未处理的异常
--------------------------
发生未处理的异常。按“中止”终止程序,
“重试”正常退出程序,“忽略”尝试继续。
--------------------------
中止 重试 忽略

如何防止 wxPython 显示此消息?我有 custom sys.excepthook,但似乎在我的 except 钩子可以干扰之前显示了这个对话框。

编辑:

wxWidgets文档wxAppConsole::OnExceptionInMainLoop被调用,并在 MSW 下显示一些精美的对话框,允许用户在不同的选项之间进行选择。然而,似乎 wxPython 不允许重载该函数......有谁知道如何在 wxPython 中更改wxAppConsole::OnExceptionInMainLoop的默认行为?
我更喜欢 Python 级别的解决方案,而不是 C/C++ 的解决方案

编辑2:

总而言之,我在 wxPython 邮件列表中询问过,Robin Dunn 回答说他会考虑在 wxPython 的下一个版本中使 wxAppConsole::OnExceptionInMainLoop成为可覆盖的。由于迫不及待,我不得不编译我自己的 wxPython 版本,它不包含该函数。事实证明, 可以通过正确设置编译标志来启用/禁用wxAppConsole::OnExceptionInMainLoop函数的存在。

4

4 回答 4

2

这一切都以编译我自己的 wxWidgets 和 wxPython 告终,只更改了一个编译标志:wxUSE_EXCEPTIONS应设置为 0。

Robin Dunn 写道,他将尝试修补 wxPython,因此无需重新编译整个库即可修改此行为。

于 2010-03-29T10:53:30.543 回答
1

如果我没记错的话,这是 wxWidgets 中顶层(wxApp)的 catch(...)。您可以使用向量异常处理程序或 _set_se_translator() 来获得结构化异常的第一枪,然后从那里退出到 WER,即 ReportFault()。

于 2009-03-06T11:19:15.550 回答
1

你有可能只处理所有事情吗?我猜你必须在绑定到小部件的每个方法周围放置一个 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 自己捕获的地方)。

于 2009-03-09T00:48:15.620 回答
0

试试http://wiki.python.org/moin/CrashingPython

于 2009-03-06T11:11:12.790 回答