【问题标题】:Crash reporting in PythonPython 中的崩溃报告
【发布时间】:2023-04-06 11:39:01
【问题描述】:

是否有可用于pure Python Tkinter applicationscrash reporting 框架?理想情况下,它应该可以跨平台工作。

实际上,这更像是“异常报告”,因为 Python 解释器本身几乎不会崩溃。

这是一个示例崩溃报告器:

【问题讨论】:

    标签: python tkinter crash-reports


    【解决方案1】:

    与其到处用try..except 污染你的代码,你应该通过设置sys.excepthook 来实现你自己的除了钩子。这是一个例子:

    import sys
    import traceback
    
    def install_excepthook():
        def my_excepthook(exctype, value, tb):
            s = ''.join(traceback.format_exception(exctype, value, tb))
            dialog = ErrorReportDialog(None, s)
            dialog.exec_()
    
        sys.excepthook = my_excepthook
    

    在您的应用程序启动时调用install_exception()

    ErrorReportDialog 是我制作的 Qt 对话框。 traceback.format_exception() 将像在 Python 的解释器中一样格式化传递给 except 钩子的参数。

    编辑:我忘了提到一个小问题。它不适用于线程(好吧,至少我上次检查时没有这样做)。对于在另一个线程中运行的代码,您需要将其包装在 try..except 块中。

    【讨论】:

      【解决方案2】:

      在您的应用程序可能崩溃的任何地方(I/O、网络等)都坚持尝试。每当调用 except 时,调用将杀死旧窗口的函数,生成新的 tkinter 通知窗口,或带有错误消息的 custom one

      对新窗口执行 root.after 并发送错误报告 (urllib)。

      如果你愿意,可以放一个重启按钮。

      没有崩溃报告框架——因为 tkinter 不是那种类型的 GUI。它几乎是简单命令行应用程序的包装器。

      如果您想要上面屏幕截图中的功能,请使用 pyqt/gtk 或 wxpython。但我很确定,无论你走到哪里,你都必须自己写记者。

      【讨论】:

      • 我不同意 tkinter “几乎是简单命令行应用程序的包装器”的说法。 Tkinter 是一个成熟的 GUI 库,适用于各种用途。而且其实Tkinter也可以用来实现截图中的所有功能。
      • 我不反对,但如果要以最少的努力制作一个完整的、可维护的 GUI(带有崩溃报告和线程),则可以使用我的其他工具包之一以上所列。它们存在的原因是因为 Tkinter 没有充分满足这一需求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2010-10-27
      • 1970-01-01
      相关资源
      最近更新 更多