长话短说,我有一个相当大的Python应用程序,除其他事项外,不outcalls为"losetup",Linux上的"摩的",等等.基本消耗必须在完成时释放的系统资源.
如果我的应用程序崩溃,我想确保正确释放这些系统资源.
做以下事情是否有意义?
def main(): # TODO: main application entry point pass def cleanup(): # TODO: release system resources here pass if __name__ == "__main__": try: main() except: cleanup() raise
这通常是做什么的吗?有没有更好的办法?也许是单例类中的析构函数?
我喜欢一般的顶级异常处理程序(无论语言如何).它们是清理资源的好地方,这些资源可能与引发异常的方法内部消耗的资源无法立即相关.
如果您有这样的框架,它也是记录这些异常的理想场所.顶级处理程序将捕获您未计划的那些奇怪的异常,并允许您在将来更正它们,否则,您可能永远不会知道它们.
请注意,您的顶级处理程序不会抛出异常!
析构函数(在__del__方法中)是一个坏主意,因为这些不能保证被调用.里的AtExit模块是一个安全的做法,但如果Python解释器崩溃(而不是Python应用程序),或者如果使用os._exit()这些仍然不火,或进程正在积极被杀,或机器重新启动.(当然,在您的情况下,最后一项不是问题.)如果您的进程容易崩溃(例如,它使用变幻无常的第三方扩展模块),您可能希望在简单的父进程中进行清理更加孤立.
如果您并不担心,请使用atexit模块.