防止wxPython显示“未处理的异常”对话框

时间:2009-03-06 10:51:28

标签: python windows wxpython error-reporting

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)