我有一个wxPython应用程序,依赖于外部的配置文件。我想要提供的友好消息的对话,显示了如果存在任何配置错误。我已经试图使这项工作通过包裹我的应用程序。Mainloop,mainloop()呼吁在尝试/除了发言。

代码下面工作的初始代码在我的MainWindow框架分类,但没有抓住任何出现的异常内mainloop,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()

我读过一些提OnExceptionInMainLoop方法,可以替代在适.应用程序级的,但来源,我读必须出的日期(2004年)由于w.应用程序不再似乎有一种方法,通过这个名字。

编辑:

我需要能够赶上未经处理的例外情况在我mainloop,mainloop这样我就可以进一步处理和显示他们在错误的对话,不是通过静默,并不终止程序。

Sys.excepthook解决方案是太低级别,并且不发挥好的wxPython mainloop,mainloop线。同时链接到其他的答案不一样的尝试/除了围绕该mainloop,mainloop其不因再次wxPython产生不同的线的应用程序的用户界面。

有帮助吗?

解决方案

我编写这样的事情 Chandler, 任何未经处理的异常弹出窗口有堆和其他信息,用户可以把附加注释(他们做了什么时候发生等等。) 和提交Chandler的开发。有点像 Mozilla对讲 (如今 他们使用Breakpad我相信)的功能,如果你会。

要做到这一点,在wxPython,需要提供重新定向参数适.应用程序。这个会弹出来 w.PyOnDemandOutputWindow (你可能会想要重写,它提供一个更好的寻找实现)。

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

  • Chandler.py 启动应用程序和设置的重新定向属性,以及试图捕捉并显示错误的对话,在正常情况下应用程序的启动失败
  • Application.py 定制的应用程序的对象,包括建立我们自定义的适.PyOnDemandOutputWindow
  • feedback.py 已经执行情况的定制适.PyOnDemandOutputWindow;这将另外需要的反馈意见。支持和feedback_xrc.py

其他提示

不知道这是否适用于wxPython应用程序,但是在sys模块中你可以覆盖excepthook属性,这是一个用3个参数调用的函数,(type,value,traceback),当捕获到unaugth异常时。您可以在那里安装自己的函数,只处理您想要的异常,并为所有其他函数调用原始函数。

咨询: http://docs.python .ORG /库/ sys.html#sys.excepthook

也许这个问题可能是一些用途,它试图捕获所有异常。

发布适合我的解决方案,但问题非常类似。

import wx
import sys
import traceback

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        panel = wx.Panel(self)
        m_close = wx.Button(panel, -1, "Error")
        m_close.Bind(wx.EVT_BUTTON, self.OnErr)
    def OnErr(self, event):
        1/0

def handleGUIException(exc_type, exc_value, exc_traceback):
    err_msg = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
    err_msg += '\n Your App will now terminate'
    # Here collecting traceback and some log files to be sent for debugging.
    # But also possible to handle the error and continue working.
    dlg = wx.MessageDialog(None, err_msg, 'Termination dialog', wx.OK | wx.ICON_ERROR)
    dlg.ShowModal()
    dlg.Destroy()
    sys.exit()

sys.excepthook = handleGUIException

if __name__ == '__main__':
    app = wx.App(redirect=False) 
    top = Frame()
    top.Show()
    app.MainLoop()

使用 sys.excepthook 对我来说非常好。

我发现以下文章有很大的帮助: wxPython:从任何地方捕获例外情况

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