1

我最终不得不编写并支持具有以下高级结构的短 python 包装脚本:

try:
    code
    ...
    ...
except:
    raise
finally:
    file_handle.close()
    db_conn.close()

请注意,我在except块中所做的只是将异常重新引发给脚本调用者,而不是装点门面;在我的特定情况下,这不是问题。这里的想法是清理代码应该始终通过finally块执行,无论是否异常。

我最好atexit为此目的使用处理程序吗?我可以不用try.

4

3 回答 3

4

atexit模块提供了一个简单的接口来注册程序正常关闭时要调用的函数。注册的函数会在解释器正常终止时自动执行。

import atexit

def cleanup():
    print 'performimg cleanup'

# multiple functions can be registered here...    
atexit.register(cleanup)

sys 模块还提供了一个钩子 sys.exitfunc,但在那里只能注册一个函数。

Finally伴随着try except块,功能finally也可以用于类似的清理,但是在finally块 sys.exc_info 是全无的。

如果 finally 子句引发另一个异常,则保存的异常将被丢弃,但是您可以将 try except 放在注册的函数中atexit以处理它们。

另一个pro-conatexit函数仅在程序终止时执行,但是您可以finally在代码中的任何位置使用(使用 try-except)并执行清理

在您想要从清理内容中引发异常的情况下atexit,如果您可以在程序结束时进行清理,那么使用 会很有帮助

于 2013-02-14T04:42:13.753 回答
1

atexit在程序终止时被调用,所以这不是你要找的。

于 2013-02-14T02:35:38.723 回答
1

只需使用contextlib.closing

with closing(resource1) as f1, closing(resource2) as f2:
    f1.something()
    f2.something()

它们将自动关闭。Files 对象可以直接用作上下文,因此您不需要closing调用。

如果close不是您的资源使用的唯一方法,您可以使用contextlib.contextmanager装饰器创建自定义函数。

于 2013-02-14T03:06:33.573 回答