python - 捕获 MainLoop 异常并在 MessageDialogs 中显示它们

标签 python exception wxpython wxwidgets

我有一个依赖外部配置文件的 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()

我读过一些关于可以在 wx.App 类中重写的 OnExceptionInMainLoop 方法的内容,但是我读到的源代码一定是过时的(2004 年),因为 wx.App 似乎不再有这样的方法姓名。

编辑:

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

sys.excepthook 解决方案级别太低,不能很好地与 wxPython 主循环线程一起使用。虽然指向另一个答案的链接执行相同的尝试/除了环绕主循环,但由于 wxPython 再次为应用程序/用户界面生成了不同的线程,这不起作用。

最佳答案

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

咨询:http://docs.python.org/library/sys.html#sys.excepthook

关于python - 捕获 MainLoop 异常并在 MessageDialogs 中显示它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/408810/

相关文章:

python - 如何清除Python中的异常状态

exception - 如何修复LockObtainFailedException : Lock obtain timed out?

exception - 异常会自动传播吗?

ruby-on-rails - 异常处理 : "undefined method ` ___ _' for nil:NilClass"

python - wxpython - 一个框架,多个面板,模块化代码

python - 获取从串行到输出到 TexCtrl 的持续更新

python - 在 Python 中覆盖 __new__ 方法的真实世界示例

python - 如何加载预训练的Word2vec模型文件?

python - 实时结合 cv2.imshow() 和 matplotlib plt.show()

python - 为什么 wx.SingleChoiceDialog 没有正确地子类化