捕获 MainLoop 异常并将其显示在 MessageDialogs 中

Sov*_*iut 5 python wxwidgets wxpython exception

我有一个依赖外部配置文件的 wxPython 应用程序。我想提供友好的消息对话框,如果有任何配置错误,就会显示该对话框。我尝试通过将 app.MainLoop() 调用包装在 try/ except 语句中来完成这项工作。

下面的代码适用于我的 MainWindow 框架类中的初始化代码,但不会捕获 MainLoop 中发生的任何异常。我怎样才能捕获这些异常呢?

if __name__ == '__main__':
    app = MyApp(0)
    try:
        MainWindow(None, -1, 'My Cool App')
        app.MainLoop()
    except ConfigParser.Error, error_message:
        messagebox = wx.MessageDialog(None, error_message, 'Configuration Error', wx.OK | wx.ICON_ERROR)
        messagebox.ShowModal()
Run Code Online (Sandbox Code Playgroud)

我读过一些关于可以在 wx.App 类中重写的 OnExceptionInMainLoop 方法的内容,但我读到的源代码必须已过时(2004 年),因为 wx.App 似乎不再具有该名称的方法。

编辑:

我需要能够在主循环期间捕获未处理的异常,以便我可以进一步处理它们并将它们显示在错误对话框中,而不是静默传递,并且不终止应用程序。

sys.excepthook 解决方案级别太低,并且与 wxPython 主循环线程不能很好地配合。虽然到另一个答案的链接做了相同的尝试/除了环绕主循环,但由于 wxPython 再次为应用程序/ui 生成了不同的线程,所以它不起作用。

Hei*_*nen 1

我为Chandler编写了类似的代码,其中任何未处理的异常都会弹出一个包含堆栈和其他信息的窗口,用户可以添加额外的注释(发生时他们做了什么等)并将其提交给 Chandler 开发人员。如果你愿意的话,有点像Mozilla Talkback(我相信现在他们使用 Breakpad)功能。

要在 wxPython 中执行此操作,您需要向 wx.App 提供重定向参数。这将弹出wx.PyOnDemandOutputWindow(您可能希望覆盖它以提供更好看的实现)。

Chandler中的相关源文件在这里:

  • Chandler.py启动应用程序并设置重定向属性,并尝试捕获并显示错误对话框,以防正常应用程序启动失败
  • Application.py自定义应用程序对象,包括设置我们自定义的wx.PyOnDemandOutputWindow
  • Feedback.py具有自定义 wx.PyOnDemandOutputWindow 的实现;它还需要feedback.xrc和feedback_xrc.py