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

我希望它能够通过Windows Vista认证,因此必须以导致Windows错误报告对话框的方式崩溃(请求“您要向Microsoft发送报告吗? “)出现。这与来自“ Certified for Windows Vista Test Cases ”的测试用例no 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 功能。

有帮助吗?

解决方案

最后编译我自己的wxWidgets和wxPython,只改变了一个编译标志: wxUSE_EXCEPTIONS 应该设置为0.

Robin Dunn写道他将尝试修补wxPython,因此可以在不重新编译整个库的情况下修改此行为。

其他提示

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

你有可能只处理一切吗?我想,你必须尝试:除了:阻止绑定到窗口小部件的每个方法。你可以写一个装饰者:

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自己捕获的地方)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top