代码之家  ›  专栏  ›  技术社区  ›  EmmEff

应用程序范围的异常处理程序是否有意义?

  •  10
  • EmmEff  · 技术社区  · 16 年前

    长话短说,我有一个重要的python应用程序,除其他外,它不需要在Linux上调用“losetup”、“mount”等。基本上消耗了完成时必须释放的系统资源。

    如果我的应用程序崩溃,我想确保正确释放这些系统资源。

    这样做有意义吗?

    def main():
        # TODO: main application entry point
        pass
    
    def cleanup():
        # TODO: release system resources here
        pass
    
    if __name__ == "__main__":
        try:
            main()
        except:
            cleanup()
            raise
    

    这是典型的做法吗?有更好的方法吗?可能是单例类中的析构函数?

    6 回复  |  直到 16 年前
        1
  •  11
  •   Bob King    16 年前

    我喜欢一般的顶级异常处理程序(不管语言如何)。它们是一个清理资源的好地方,这些资源可能与抛出异常的方法中消耗的资源没有直接关系。

    这也是一个很棒的地方 日志 如果你有这样一个框架的话,这些例外就可以了。顶级处理程序将捕获那些您没有计划的奇怪的异常,并允许您在将来纠正它们,否则,您可能永远不会知道它们。

    请注意,您的顶级处理程序不会抛出异常!

        2
  •  7
  •   Thomas Wouters    16 年前

    析构函数(如在一个方法中)是一个坏主意,因为它们不能保证被调用。ATEXIT模块是一种更安全的方法,但是如果Python解释器崩溃(而不是Python应用程序),或者使用了os._exit(),或者进程被严重杀死,或者机器重新启动,这些模块仍然不会启动。(当然,最后一项在您的情况下不是问题。)如果您的进程容易崩溃(例如,它使用易变的第三方扩展模块),您可能希望在一个简单的父进程中进行清理以获得更多的隔离。

    如果您不太担心,请使用ATEXIT模块。

        3
  •  2
  •   Darren Kopp    16 年前

    应用程序范围的处理程序可以。它们非常适合伐木。只要确保应用程序范围内的应用程序是持久的,不太可能崩溃。

        4
  •  2
  •   nosklo    16 年前

    当然,如果使用类,应该释放它们在析构函数中分配的资源。使用try:在整个应用程序上,只要您想释放尚未被类的析构函数释放的资源。

    而不是使用catch all except:,您应该使用以下块:

    try:
        main()
    finally:
        cleanup()
    

    这将确保以更为蟒蛇式的方式进行清理。

        5
  •  1
  •   keturn    16 年前

    这似乎是一种合理的方法,比单例类上的析构函数更直接和可靠。你也可以看看 atexit “模块。(发音为“at exit”,而不是“a tex it”或类似的。我困惑了很久。)

        6
  •  1
  •   Ignacio Vazquez-Abrams    16 年前

    考虑编写一个上下文管理器并使用WITH语句。