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

Prevent wxPython from showing 'Unhandled exception' dialog

提问人:Abgan 提问时间:3/6/2009 最后编辑:Abgan 更新时间:3/29/2010 访问量:1621

问:

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

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

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

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显示此消息?我有自定义,但似乎这个对话框显示在我的 except 钩子可以干扰之前。sys.excepthook

编辑:

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

编辑2:

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

python windows wxpython 错误报告

评论

0赞 John Fouhy 3/10/2009
如果你在这里没有得到答案,你最好的选择可能是尝试wxpython邮件列表,因为很多专家(包括Robin Dunn)都在那里闲逛。

答:

0赞 Seun Osewa 3/6/2009 #1

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

1赞 MSalters 3/6/2009 #2

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

评论

0赞 Abgan 3/6/2009
你对 wxWidgets 和 ReportFault() 的看法是正确的,这为我指明了正确的方向。但是在wxPython中,我无法更改默认行为(似乎它没有导出到Python)。
0赞 MSalters 3/9/2009
可能想更新您的问题,似乎您想要一个 100% 的 python 解决方案。我建议的两个解决方案都假定本机 ccode,无论是在底层 CRT 还是在 Win32 级别。
1赞 John Fouhy 3/9/2009 #3

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

评论

0赞 Abgan 3/10/2009
我的代码有 >80k 行代码,所以这将花费相当多的时间......恐怕错误是在C++代码中引发的,并且在C++级别得到完全处理。我真正想做的是在wxWidgets这样做之前处理该错误。
0赞 Abgan 3/10/2009
无论如何 - 我要检查你的方法,因为它没有出现在我的脑海中。谢谢你,为你投赞成票。:-)
2赞 Abgan 3/29/2010 #4

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

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