Python 应用程序范围的异常处理程序有意义吗?

Python 应用程序范围的异常处理程序有意义吗?,python,exception-handling,Python,Exception Handling,长话短说,我有一个重要的Python应用程序,它在Linux上对“losetup”、“mount”等进行了调用。基本上消耗了完成时必须释放的系统资源 如果我的应用程序崩溃,我希望确保正确释放这些系统资源 这样做有意义吗 def main(): # TODO: main application entry point pass def cleanup(): # TODO: release system resources here pass if __name_

长话短说,我有一个重要的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

这是典型的做法吗?有更好的办法吗?也许singleton类中的析构函数?

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

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

如果您有这样一个框架,那么它也是记录这些异常的绝佳场所。顶级处理程序将捕获那些您没有计划的奇怪异常,并让您在将来纠正它们,否则,您可能永远不会知道它们

只是要小心,您的顶级处理程序不会抛出异常

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


如果你真的不担心,可以使用atexit模块。

这似乎是一种合理的方法,而且比单例类上的析构函数更简单、更可靠。您还可以查看“”模块。(发音为“at exit”,而不是“a tex it”或类似的东西。我很长一段时间都混淆了这一点。)

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

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

try:
    main()
finally:
    cleanup()

这将确保以更符合Python的方式进行清理。

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

我也不完全确定是否会调用析构函数。谢谢你的澄清!看来atexit正是我所需要的。顶级异常处理程序在GUI应用程序中很有用。事件处理程序中抛出的未捕获异常将显示在控制台中,但通常不会使程序崩溃(例如在PyGTK和PyQt中),这可能会被忽略。如果你在处理程序中显示错误对话框,你就没有这个问题。我还建议你把它们放在进行批处理的控制台应用程序中。我让他们发了一封电子邮件,这样我们就可以得到任何问题的通知,但至少它可以记录下来。